Asp.net-Mvc
將 Castle Windsor 與 SignalR 集成 - 我應該如何處理?
我開始使用 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; } } }