private void RegisterCallbackInternal <TContract>(TContract callbackInstanceContext, ContractInfo contract) where TContract : class { lock (_proxyChannelManagerContainerLocker) { IProxyChannelManager <TContract> channelMgr = ProxyChannelManagerFactory.CreateCallback <TContract>(callbackInstanceContext, contract); _proxyChannelManagerContainer[contract.Key] = channelMgr; } }
private void RegisterProxyChannelManager <TContract>(IProxyChannelManager <TContract> proxyChannelManager, string contractKey) { if (!_proxyChannelManagerContainer.ContainsKey(contractKey)) { proxyChannelManager.ChannelConnected += new EventHandler <ChannelConnectedEventArgs>(OnProxyChannelManagerChannelConnected); proxyChannelManager.ChannelReconnected += new EventHandler <ChannelConnectedEventArgs>(OnProxyChannelManagerChannelReconnected); proxyChannelManager.ChannelDisconnected += new EventHandler <ChannelDisconnectedEventArgs>(OnProxyChannelManagerChannelDisconnected); proxyChannelManager.ChannelExceptionRaised += new EventHandler <ChannelExceptionRaisedEventArgs>(OnProxyChannelManagerChannelExceptionRaised); _proxyChannelManagerContainer.Add(contractKey, proxyChannelManager); } else { proxyChannelManager = GetProxyChannelManager <TContract>(contractKey); } }
private TContract GetCallbackChannelInternal <TContract>(ContractInfo contract) { IProxyChannelManager <TContract> channelManager = GetProxyChannelManager <TContract>(contract.Key); if (channelManager == null) { lock (_proxyChannelManagerContainerLocker) { channelManager = GetProxyChannelManager <TContract>(contract.Key); } } TContract channel = default(TContract); if (channelManager != null) { channel = channelManager.GetChannel(); } return(channel); }
private TContract GetDuplexChannelInternal <TContract>(InstanceContext instanceContext, ContractInfo contract) where TContract : class { IProxyChannelManager <TContract> proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { lock (_proxyChannelManagerContainerLocker) { proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { proxyChannelManager = ProxyChannelManagerFactory.CreateDuplex <TContract>(instanceContext, contract); RegisterProxyChannelManager(proxyChannelManager, contract.Key); } } } return(proxyChannelManager.GetChannel()); }
private void GetDuplexChannelAsyncInternal <TContract>(InstanceContext instanceContext, ContractInfo contract, EventHandler <ChannelEstablishedEventArgs> callback) where TContract : class { IProxyChannelManager <TContract> proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { lock (_proxyChannelManagerContainerLocker) { proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { proxyChannelManager = ProxyChannelManagerFactory.CreateDuplex <TContract>(instanceContext, contract); RegisterProxyChannelManager(proxyChannelManager, contract.Key); } } } SaveAsyncChannelEstablishedCallback(contract.Key, callback); proxyChannelManager.GetChannelAsync(); }
private TContract GetChannelInternal <TContract>(ContractInfo contract) where TContract : class { // get the proxy channel manager by the specified contract type and key IProxyChannelManager <TContract> proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { lock (_proxyChannelManagerContainerLocker) { // double check the channel manager value proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { proxyChannelManager = ProxyChannelManagerFactory.Create <TContract>(contract); RegisterProxyChannelManager(proxyChannelManager, contract.Key); } } } return(proxyChannelManager.GetChannel()); }
/// <summary> /// 获取指定回调契约类型的所有通道连接 /// </summary> /// <typeparam name="TContract">回调契约类型</typeparam> /// <returns>指定回调契约类型的所有通道连接</returns> public IList <TContract> GetCallbackChannels <TContract>() where TContract : class { List <TContract> list = new List <TContract>(); List <object> proxyChannelManagers = new List <object>(_proxyChannelManagerContainer.Values); foreach (var item in proxyChannelManagers) { if (item is IProxyChannelManager <TContract> ) { IProxyChannelManager <TContract> channelManager = item as IProxyChannelManager <TContract>; if (channelManager != null) { Type channelType = channelManager.GetChannel().GetType(); Type expectedType = typeof(TContract); TContract callback = default(TContract); if (channelType.FullName != expectedType.FullName) { channelType = channelType.GetInterface(expectedType.FullName); } if (channelType != null && channelType.FullName == expectedType.FullName) { callback = channelManager.GetChannel(); if (!list.Contains <TContract>(callback)) { list.Add(callback); } } } } } return(list); }
/// <summary> /// 获取指定服务契约类型的所有通道连接 /// </summary> /// <typeparam name="TContract">服务契约类型</typeparam> /// <returns>指定服务契约类型的所有通道连接</returns> public IList <TContract> GetChannels <TContract>() where TContract : class { List <TContract> list = new List <TContract>(); IList <ServiceEndpoint> endpoints = EndpointProvider.GetEndpoints <TContract>(); List <IProxyChannelManager <TContract> > channelManagerList = new List <IProxyChannelManager <TContract> >(); List <ServiceEndpoint> channelExistEndpoints = new List <ServiceEndpoint>(); List <object> proxyChannelManagers = new List <object>(_proxyChannelManagerContainer.Values); foreach (var item in proxyChannelManagers) { if (item is ProxyChannelManager <TContract> ) { IProxyChannelManager <TContract> channelManager = item as IProxyChannelManager <TContract>; if (channelManager != null) { channelManagerList.Add(channelManager); foreach (ServiceEndpoint endpoint in endpoints) { if (endpoint.Address.Uri.Host == channelManager.ContractInfo.HostName) { channelExistEndpoints.Add(endpoint); break; } } } } } foreach (ServiceEndpoint endpoint in channelExistEndpoints) { endpoints.Remove(endpoint); } if (endpoints.Count > 0) { // create proxy channel manager for those endpoints who have not been created foreach (ServiceEndpoint endpoint in endpoints) { ContractInfo contract = new ContractInfo(typeof(TContract), endpoint.Address.Uri.Host); IProxyChannelManager <TContract> proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { lock (_proxyChannelManagerContainerLocker) { proxyChannelManager = GetProxyChannelManager <TContract>(contract.Key); if (proxyChannelManager == null) { proxyChannelManager = ProxyChannelManagerFactory.Create <TContract>(contract); RegisterProxyChannelManager(proxyChannelManager, contract.Key); } } } if (proxyChannelManager != null) { channelManagerList.Add(proxyChannelManager); } } } foreach (ProxyChannelManager <TContract> channelManager in channelManagerList) { list.Add(channelManager.GetChannel()); } return(list); }