internal ResolvedTransport ResolveTransport(string transportId) { if (m_IsDisposed.WaitOne(0)) { throw new ObjectDisposedException($"Can not create transport {transportId}. TransportManager instance is disposed"); } var transportInfo = m_TransportResolver.GetTransport(transportId); if (transportInfo == null) { throw new ApplicationException($"Transport '{transportId}' is not resolvable"); } var factory = m_TransportFactories.FirstOrDefault(f => f.Name == transportInfo.Messaging); if (factory == null) { throw new ApplicationException($"Can not create transport '{transportId}', {transportInfo.Messaging} messaging is not supported"); } var transport = m_Transports.GetOrAdd( transportInfo, _logFactory == null ? new ResolvedTransport(_log, transportInfo, () => ProcessTransportFailure(transportInfo), factory) : new ResolvedTransport(_logFactory, transportInfo, () => ProcessTransportFailure(transportInfo), factory)); return(transport); }
internal ResolvedTransport ResolveTransport(string transportId) { if (m_IsDisposed.WaitOne(0)) { throw new ObjectDisposedException(string.Format("Can not create transport {0}. TransportManager instance is disposed", transportId)); } var transportInfo = m_TransportResolver.GetTransport(transportId); if (transportInfo == null) { throw new ApplicationException(string.Format("Transport '{0}' is not resolvable", transportId)); } var factory = m_TransportFactories.FirstOrDefault(f => f.Name == transportInfo.Messaging); if (factory == null) { throw new ApplicationException( string.Format("Can not create transport '{0}', {1} messaging is not supported", transportId, transportInfo.Messaging)); } ResolvedTransport transport; if (!m_Transports.TryGetValue(transportInfo, out transport)) { lock (m_Transports) { if (!m_Transports.TryGetValue(transportInfo, out transport)) { transport = _logFactory == null ? new ResolvedTransport(_log, transportInfo, () => ProcessTransportFailure(transportInfo), factory) : new ResolvedTransport(_logFactory, transportInfo, () => ProcessTransportFailure(transportInfo), factory); m_Transports.Add(transportInfo, transport); } } } return(transport); }