public Session(params IProcess[] processes)
{
Contract.Requires(processes != null);
_processes = new IProcess[processes.Length];
Array.Copy(processes, _processes, processes.Length);
foreach (var process in _processes)
{
process.Session = this;
}
// create the message handlers dictionary
_messageHandlers = new Dictionary<Type, List<IProcess>>();
foreach(var process in _processes)
{
foreach(var messageType in process.MessageTypes)
{
List<IProcess> handlers = null;
if(!_messageHandlers.TryGetValue(messageType, out handlers))
{
handlers = new List<IProcess>();
_messageHandlers.Add(messageType, handlers);
}
handlers.Add(process);
}
}
_messageQueue = new Queue<IMessage>();
_processingCallback = new WaitCallback(_processMessages);
// open all of the ports first
foreach (var p in _processes.OfType<IPort>())
{
p.Open();
}
// then resolve all of the process dependencies
foreach (var process in _processes)
{
process.Resolve(processes);
}
}