Asp.net 在SignalR 2.0中使用现有的IoC容器

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 /*

如何在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 /*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));