【问题标题】:SignalR 2, Autofac 3.5, MVC 5 and OWIN: How to inject SignalR hub into a controller?SignalR 2、Autofac 3.5、MVC 5 和 OWIN:如何将 SignalR 集线器注入控制器?
【发布时间】:2017-10-25 09:33:25
【问题描述】:

我正在尝试使用 SignalR 将通知系统添加到我的 MVC Web 应用程序。我想在控制器中发生某些操作时触发通知。

感谢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,我不确定是否应该改用它?

【问题讨论】:

  • 你有没有想过这个问题?

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


【解决方案1】:

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

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

然后发布通知或喜欢:

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

【讨论】:

  • 谢谢 Rob,如果您使用 OWIN(或可能是 DI),我认为您不应该使用 GlobalHost? Autofac 文档在这里提到了autofaccn.readthedocs.io/en/v4.0.0/integration/signalr.html。理想情况下,我只想将一个接口传递给集线器,或者可以获取集线器的东西到我的控制器中,这样我就可以隔离所有内容以进行测试。
  • 啊,很公平,我收集到它可能不是你想要的,但我想我还是会提到它以防万一。祝你好运找到解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2019-02-09
  • 2020-04-18
  • 1970-01-01
  • 2018-10-27
  • 1970-01-01
相关资源
最近更新 更多