Example #1
0
        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
        }