Asp.net-Mvc

將 Castle Windsor 與 SignalR 集成 - 我應該如何處理?

  • September 29, 2017

我開始使用 SignalR,一旦配置好一切,它就可以很好地工作。但是,我所開發的幾乎所有應用程序都使用 Castle Windsor,因此能夠將它們一起使用會很棒。我想這樣做的原因是我可以在持久連接中使用 Castle 依賴項/服務。

我仔細研究了原始碼,看起來我可以用基於 Castle 的替代 DependencyResolver(即,實現 IDependencyResolver 的 Castle),或者我可以將 DependencyResolver 的用法更改為 Castle。

其中哪一個是更好的主意?我可以使用另一種方​​法來結合 Castle 和 SignalR 嗎?

謝謝,埃里克

2016 年 8 月更新

根據評論,我不再使用下面的方法,但現在使用 GlobalHost.DependencyResolver

所以在 Global.asax.cs 我初始化的東西

public static void Init(IWindsorContainer container)
{
   var conn = configurationManager.ConnectionStrings["SRSQL"].ConnectionString;
   GlobalHost.DependencyResolver.Register(typeof(IHubActivator), 
                                     () => new SignalHubActivator(container));
   GlobalHost.DependencyResolver.Register(typeof(ILoggingService), 
                                     container.Resolve<ILoggingService>);
   //etc or you could just pass your existing container to the resolver
   GlobalHost.DependencyResolver.UseSqlServer(conn);    
}

然後在集線器

private ILoggingService LoggingService{ get; set; }

   public NotificationHub()
   {
       LoggingService = GlobalHost.DependencyResolver.Resolve<ILoggingService>();
   }

並且為了完整性

public class SignalHubActivator: IHubActivator
{
   private readonly IWindsorContainer _container;

   public SignalHubActivator(IWindsorContainer container)
   {
       _container = container;
   }


   public IHub Create(HubDescriptor descriptor)
   {
               var result=  _container.Resolve(descriptor.HubType) as IHub;

       if (result is Hub)
       {
           _container.Release(result);
       }

   return result;
   }

}

2012年的舊答案

我選擇了設置我們自己的 DependencyResolver 的第一個選項

AspNetHost.SetResolver(new SignalResolver(_container));

如果需要,我可以提供 SignalResolver,但現在不考慮可讀性。

另一個重要的注意事項是集線器必須有一個空的建構子,以便我們的城堡容器通過屬性注入,例如

public class NotificationHub : Hub, INotificationHub
   { 

public INotificationService NotificationService { get; set; }

和請求的解析器

public class SignalResolver : DefaultDependencyResolver
   {
       private readonly IWindsorContainer _container;

       public SignalResolver(IWindsorContainer container) 
       {
           if (container == null)
           {
               throw new ArgumentNullException("container");
           }
           _container = container;
       }

       public override object GetService(Type serviceType) 
       {
           return TryGet(serviceType) ?? base.GetService(serviceType);
       }

       public override IEnumerable<object> GetServices(Type serviceType)
       {
           return TryGetAll(serviceType).Concat(base.GetServices(serviceType));
       }

       private object TryGet(Type serviceType)
       {
           try
           {
               return _container.Resolve(serviceType);
           }
           catch (Exception)
           {
               return null;
           }
       }

       private IEnumerable<object> TryGetAll(Type serviceType)
       {
           try
           {
               var array = _container.ResolveAll(serviceType);
               return array.Cast<object>().ToList();
           }
           catch (Exception)
           {
               return null;
           }
       }
   }

引用自:https://stackoverflow.com/questions/10507894