public ChannelProvider <TChannel> GetChannelProvider <TChannel>(ChannelAccessor <T, TChannel> channelAccessor, KeyAccessor <TChannel, TKey> messageKeyAccessor, InstanceChannelPolicy <T, TChannel> channelPolicy) { Guard.AgainstNull(channelAccessor, "channelAccessor"); Guard.AgainstNull(messageKeyAccessor, "messageKeyAccessor"); Guard.AgainstNull(channelPolicy, "channelPolicy"); FiberProvider <TKey> fiberProvider = _configurator.GetConfiguredProvider(); if (_sessionProvider == null) { throw new ChannelConfigurationException(typeof(TChannel), "No NHibernate ISession provider specified for NHibernate instance: " + typeof(T).ToShortTypeName()); } SessionProvider <TChannel> sessionProvider = m => _sessionProvider.GetSession(m); var channelProvider = new NHibernateInstanceChannelProvider <T, TChannel, TKey>(fiberProvider, sessionProvider, messageKeyAccessor, channelAccessor, channelPolicy); return(channelProvider); }
public ChannelProvider <TChannel> GetChannelProvider <TChannel>(ChannelAccessor <T, TChannel> channelAccessor, KeyAccessor <TChannel, TKey> messageKeyAccessor, InstanceChannelPolicy <T, TChannel> channelPolicy) { Guard.AgainstNull(channelAccessor, "channelAccessor"); Guard.AgainstNull(messageKeyAccessor, "messageKeyAccessor"); if (_cache == null) { Func <TKey, T> missingInstanceProvider = _configurator.GetConfiguredInstanceFactory(); _cache = new Cache <TKey, T>(missingInstanceProvider); } Cache <TKey, T> cache = _cache; var instanceProvider = new DelegateChannelProvider <TChannel>(msg => { TKey key = messageKeyAccessor(msg); T instance; if (cache.Has(key)) { if (!channelPolicy.IsHandledByExistingInstance(msg)) { channelPolicy.WasNotHandled(msg); return(null); } instance = cache[key]; } else { if (!channelPolicy.CanCreateInstance(msg, out instance)) { channelPolicy.WasNotHandled(msg); return(null); } cache.Add(key, instance); } return(channelAccessor(instance)); }); FiberProvider <TKey> fiberProvider = _configurator.GetConfiguredProvider(); var channelProvider = new CacheChannelProvider <TChannel, TKey>(fiberProvider, instanceProvider, messageKeyAccessor); return(channelProvider); }