Asp.net 在SignalR 2.0中使用现有的IoC容器
如何在SignalR 2.0中使用现有的IoC 在本教程中,我似乎需要设置一个类,通过属性从OWIN调用该类:Asp.net 在SignalR 2.0中使用现有的IoC容器,asp.net,dependency-injection,inversion-of-control,signalr,owin,Asp.net,Dependency Injection,Inversion Of Control,Signalr,Owin,如何在SignalR 2.0中使用现有的IoC 在本教程中,我似乎需要设置一个类,通过属性从OWIN调用该类: using Microsoft.Owin; using Owin; [assembly: OwinStartup(typeof(SignalRChat.Startup))] namespace SignalRChat { public class Startup { public void Configuration(IAppBuilder app /*
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(SignalRChat.Startup))]
namespace SignalRChat
{
public class Startup
{
public void Configuration(IAppBuilder app /*HOW AM I GONNA GET UNITY CONTAINER HERE?*/)
{
var hubConfig = new HubConfiguration()
{
EnableJSONP = true,
EnableDetailedErrors = true,
EnableJavaScriptProxies = true,
Resolver = new SignalRUnityDependencyResolver(container)
};
// Any connection or hub wire up and configuration should go here
app.MapSignalR(hubConfig);
}
}
}
这里的问题是我已经有了一个容器,它是引导式的,容器中有一些单例实例需要与同一主机下共享的MVC应用程序共享
然而,这里的问题是,与以前不同的是,看起来我无法从自己的代码中调用mapsigner
方法。相反,我需要依靠OWIN为我做这件事。但是,OWIN不知道我已经设置的容器
解决这个问题的最佳方法是什么?我有一些非常粗糙的想法,如何使用静态变量来保存其中的一些,来破解一个解决方案——但我讨厌这种想法。代码将是脆弱的,操作顺序很容易引入一个微妙的错误
有没有一种方法可以在不让OWIN调用上述方法的情况下获取IAppBuilder实例?通过这种方式,我可以更好地控制SignalR初始化的时间,并且我可以将自己的IoC传递到配置中。在我的例子中,我创建了一个自定义集线器激活器,它在我的应用程序和SignalR之间使用一个共享容器(通过构造函数注入),这样整个应用程序就只有一个复合根 请尝试以下操作:
public class CustomHubActivator : IHubActivator
{
private readonly Container _container;
public MseHubActivator(Container container)
{
_container = container;
}
public IHub Create(HubDescriptor descriptor)
{
return _container.GetInstance(descriptor.HubType) as IHub;
}
}
在引导应用程序时注册自定义集线器激活器(可能是global.asax)
这是一个更简单的解决方案,而不是再次配置依赖信号器的解析器,这很奇怪。在SignalR 2.0之前,ASP.NET为您调用了Global.asax,您在其中注册了路由。这几乎是一样的。什么是“容器”类型?
GlobalHost.DependencyResolver.Register(typeof (IHubActivator),
() => new CustomHubActivator(Container));