簡體   English   中英

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

[英]SignalR 2, Autofac 3.5, MVC 5 and OWIN: How to inject SignalR hub into a controller?

我正在嘗試使用SignalR將通知系統添加到我的MVC Web應用程序。 我想在控制器中發生某些操作時觸發通知。

得益於Microsoft出色的SignalR文檔 ,使SignalR 2的啟動和運行變得輕而易舉 ,但是我正在努力找出現在如何更改該代碼以將Autofac用於DI,以便可以注入集線器,或者可以使我做些什么訪問集線器,進入控制器。

我已經按照Autofac文檔中的示例設置了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包 ,但也有Autofac.SignalR2 4.0.0 ,我不確定是否應該使用它?

不知道這是否正是您所需要的,但是我相信您可以使用以下命令訪問控制器中的集線器:

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

然后發布通知或類似信息:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM