VS2012注册和dependency injection中的SignalR 2.0

我能够使用我自己的DI与SignalR 1.13一起工作:

//Funq container GlobalHost.DependencyResolver = new FunqDependencyResolver(container); RouteTable.Routes.MapHubs(); 

现在有了新版本2.0,我被困住了。

 using Microsoft.Owin; using Owin; //SignalR 2.0 no longer uses RouteTable.Routes.MapHubs(); [assembly: OwinStartup(typeof(SignalRChat.Startup))] namespace SignalRChat { public class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } } } 

(VS2013中的新SignalR 2.0设置截图)

在此处输入图像描述

首先,它是VS2013的屏幕。 我的VS2012 Pro没有Create New …-> OWIN Startup类。我手写了一个。 但是现在我如何调用新的启动类来替换旧的MapHub()函数?

其次,我正在使用运行其余Web项目的DI。 我如何现在将signalR注册到我的DI?

编辑——————————————–

问题还有一点。 我在Global.asax.cs-> Application_Start()中创建了我的DI容器,但是自动创建并调用了SignalR Startup.cs-> Configuration()。 如何将DI容器传递给SignalR Startup?

Global.asax.cs(这在应用程序启动时自动运行)

 protected void Application_Start(object sender, EventArgs e) { var appHost = new AppHost(); //DI init appHost.Init(); var container = appHost.Container; //DI container here var resolver = new FunqDependencyResolver(container); } 

SignalRStarter.cs(这也会在应用启动时自动运行)

 [assembly: OwinStartup(typeof(WebApp.SignalRStarter))] namespace WebApp { public class SignalRStarter { public FunqDependencyResolver FunqDependencyResolver { get; set; } public bool EnableDetailedErrors { get; set; } public void Configuration(IAppBuilder app) { app.MapSignalR(new HubConfiguration() { EnableDetailedErrors = EnableDetailedErrors, Resolver = FunqDependencyResolver }); } } } 

您仍然可以像在1.1.3中那样设置依赖项解析器。 然而,一个更好的方法(做同样的事情,只是更干净)将是:

 app.MapSignalR(new HubConfiguration { Resolver = new FunqDependencyResolver(container) }); 

注意: app.MapSignalR()是SignalR 2.0.0+的新RouteTable.Routes.MapHubs() ,这意味着你不应再使用RouteTable.Routes.MapHubs()

现在关于没有在VS2012中拥有Owin Startup类的问题,那没关系! 只需创建一个新的空白类并将代码复制粘贴到您的类中。 无需其他设置。

我在下面使用这种方法而不改变HubConfiguration。

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

我共享了SignalR和我的Web应用程序的容器,通过CustomHubActivator解析Hub,我可以在Hub中注入任何参数作为参数。