VS2012注册和依赖注入中的SignalR 2.0

时间:2013-10-28 02:17:17

标签: c# signalr signalr-hub

我能够使用我自己的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设置)

enter image description here

首先,它是来自here的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
            });
        }
    }
}

2 个答案:

答案 0 :(得分:9)

您仍然可以像在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课程的问题,那没关系!只需创建一个新的空白类并复制n将代码粘贴到您的类中。无需其他设置。

答案 1 :(得分:2)

我在不更改HubConfiguration的情况下使用了以下方法。

Using an existing IoC Container in SignalR 2.0

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