SignalR 2,Autofac 3.5,MVC 5和OWIN:如何将SignalR集线器注入控制器?

时间:2017-10-25 09:33:25

标签: asp.net-mvc signalr autofac signalr-2

我正在尝试使用SignalR向我的MVC网络应用添加通知系统。我想在控制器中发生某些操作时触发通知。

由于Microsoft's excellent SignalR documentation,启动和运行SignalR 2是一件轻而易举的事,但我正在努力解决如何更改代码以使用Autofac进行DI,以便我可以注入集线器,或者允许我访问集线器,进入控制器的东西。

我按照Autofac documentation中的示例设置了Autofac依赖关系解析器:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "ApplicationCookie",
            LoginPath = new PathString("/Account/Login"),
            CookieName = "fornet"
        });


        var builder = new ContainerBuilder();

        // STANDARD SIGNALR SETUP:

        // Get your HubConfiguration. In OWIN, you'll create one
        // rather than using GlobalHost.
        var config = new HubConfiguration();

        // Register your SignalR hubs.
        builder.RegisterHubs(Assembly.GetExecutingAssembly());

        // Set the dependency resolver to be Autofac.
        var container = builder.Build();
        config.Resolver = new AutofacDependencyResolver(container);

        // OWIN SIGNALR SETUP:

        // Register the Autofac middleware FIRST, then the standard SignalR middleware.
        app.UseAutofacMiddleware(container);
        app.MapSignalR("/signalr", config);

    }
}

并添加了一个中心:

public class TestHub : Hub
{
    public ITest Test { get; set; }
    public void Hello()
    {
        Test.DoStuff();
    }

    public override Task OnConnected()
    {
        Clients.Caller.hello("Welcome!");
        return base.OnConnected();
    }
}

但现在我无法弄清楚如何将集线器注入我的控制器。我尝试了public SettingsController(IHubContext hubContext)public SettingsController(IHubContext<TestHub> hubContext)public SettingsController(IHubConnectionContext<TestHub> hubConnectionContext)public SettingsController(TestHub hubConnectionContext),但他们都给了我例外。

注入集线器的正确方法是什么?

编辑:我应该说我已经阅读了很多与此相关的SO问题,但还没有找到答案。这些问题要么与Autofac和SignalR的不同版本有关,要么日期表明他们会这样做。

编辑2:我正在使用Autofac.SignalR 3.0.2 NuGet package,但也有Autofac.SignalR2 4.0.0,我不确定我是否应该使用它?

1 个答案:

答案 0 :(得分:0)

不确定这是否正是您所需要的,但我相信您可以使用以下内容在控制器中访问您的集线器:

var hub = GlobalHost.ConnectionManager.GetHubContext<yoursignalrnamespace.yourhubname>();

然后发布通知或类似内容:

hub.Clients.All.postnotification("notified!")