public PeerMessageDispatcher(PeerMessageQueueAdapter <ChannelInterfaceType, TChannel> queueHandler, PeerNodeImplementation peerNode, ChannelManagerBase channelManager, EndpointAddress to, Uri via)
        {
            this.quotaHelper = new PeerQuotaHelper(0x7fffffff);
            PeerNodeImplementation.ValidateVia(via);
            this.queueHandler   = queueHandler;
            this.peerNode       = peerNode;
            this.to             = to;
            this.via            = via;
            this.channelManager = channelManager;
            EndpointAddress address = null;

            this.securityProtocol = ((IPeerFactory)channelManager).SecurityManager.CreateSecurityProtocol <ChannelInterfaceType>(to, ServiceDefaults.SendTimeout);
            if (typeof(IDuplexChannel).IsAssignableFrom(typeof(ChannelInterfaceType)))
            {
                address = to;
            }
            PeerMessageFilter[] filters = new PeerMessageFilter[] { new PeerMessageFilter(via, address) };
            peerNode.RegisterMessageFilter(this, this.via, filters, (ITransportFactorySettings)this.channelManager, new PeerNodeImplementation.MessageAvailableCallback(this.OnMessageAvailable), this.securityProtocol);
            this.registered = true;
        }
 // internal message filtering
 internal void RegisterMessageFilter(object registrant, Uri via, PeerMessageFilter[] filters,
     ITransportFactorySettings settings, MessageAvailableCallback callback, SecurityProtocol securityProtocol)
 {
     MessageFilterRegistration registration = new MessageFilterRegistration();
     registration.registrant = registrant;
     registration.via = via;
     registration.filters = filters;
     registration.settings = settings;
     registration.callback = callback;
     registration.securityProtocol = securityProtocol;
     lock (ThisLock)
     {
         messageFilters.Add(registrant, registration);
         RefCountedSecurityProtocol protocolWrapper = null;
         if (!this.uri2SecurityProtocol.TryGetValue(via, out protocolWrapper))
         {
             protocolWrapper = new RefCountedSecurityProtocol(securityProtocol);
             this.uri2SecurityProtocol.Add(via, protocolWrapper);
         }
         else
             protocolWrapper.AddRef();
     }
 }
 internal void RegisterMessageFilter(object registrant, Uri via, PeerMessageFilter[] filters, ITransportFactorySettings settings, MessageAvailableCallback callback, SecurityProtocol securityProtocol)
 {
     MessageFilterRegistration registration = new MessageFilterRegistration {
         registrant = registrant,
         via = via,
         filters = filters,
         settings = settings,
         callback = callback,
         securityProtocol = securityProtocol
     };
     lock (this.ThisLock)
     {
         this.messageFilters.Add(registrant, registration);
         RefCountedSecurityProtocol protocol = null;
         if (!this.uri2SecurityProtocol.TryGetValue(via, out protocol))
         {
             protocol = new RefCountedSecurityProtocol(securityProtocol);
             this.uri2SecurityProtocol.Add(via, protocol);
         }
         else
         {
             protocol.AddRef();
         }
     }
 }