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 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> 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); }