public ChannelWrapper() { // Internal messaging used for messaging between channel unwrapper // and typed message receivers. // We want that requests do not block each other. So every request will be processed in its own thread. IMessagingSystemFactory anInternalMessaging = new ThreadPoolMessagingSystemFactory(); // All messages are received via one channel. So we must provide "unwrapper" forwarding incoming messages // to correct receivers. IChannelWrapperFactory aChannelWrapperFactory = new ChannelWrapperFactory(); myDuplexChannelUnwrapper = aChannelWrapperFactory.CreateDuplexChannelUnwrapper(anInternalMessaging); // To connect receivers and the unwrapper with duplex channels we can use the following helper class. IConnectionProviderFactory aConnectionProviderFactory = new ConnectionProviderFactory(); IConnectionProvider aConnectionProvider = aConnectionProviderFactory.CreateConnectionProvider(anInternalMessaging); // Factory to create message receivers. IDuplexTypedMessagesFactory aMessageReceiverFactory = new DuplexTypedMessagesFactory(); // Create receiver to sum two numbers. plusReceiver = aMessageReceiverFactory.CreateDuplexTypedMessageReceiver <TestOutput, TestInput>(); plusReceiver.MessageReceived += (s, e) => { Console.WriteLine("PLUS: " + e.RequestMessage.Name + " | " + e.RequestMessage.Value); plusReceiver.SendResponseMessage(e.ResponseReceiverId, new TestOutput { Value = e.RequestMessage.Name + "+" + e.RequestMessage.Value }); }; // attach method handling the request aConnectionProvider.Attach(plusReceiver, "plus"); // attach the input channel to get messages from unwrapper // Create receiver to sum two numbers. minusReceiver = aMessageReceiverFactory.CreateDuplexTypedMessageReceiver <TestOutput, TestInput>(); minusReceiver.MessageReceived += (s, e) => { Console.WriteLine("MINUS: " + e.RequestMessage.Name + " | " + e.RequestMessage.Value); minusReceiver.SendResponseMessage(e.ResponseReceiverId, new TestOutput { Value = e.RequestMessage.Name + "-" + e.RequestMessage.Value }); }; // attach method handling the request aConnectionProvider.Attach(minusReceiver, "minus"); // attach the input channel to get messages from unwrapper // Create receiver to sum two numbers. dotReceiver = aMessageReceiverFactory.CreateDuplexTypedMessageReceiver <TestOutput, TestInput>(); dotReceiver.MessageReceived += (s, e) => { Console.WriteLine("DOT: " + e.RequestMessage.Name + " | " + e.RequestMessage.Value); dotReceiver.SendResponseMessage(e.ResponseReceiverId, new TestOutput { Value = e.RequestMessage.Name + "." + e.RequestMessage.Value }); }; // attach method handling the request aConnectionProvider.Attach(dotReceiver, "dot"); // attach the input channel to get messages from unwrapper }