如何在ASP.NET 5(vNext)中设置SignalR Hub依赖注入?

Mar*_*cey 9 c# asp.net dependency-injection signalr asp.net-core

尝试使用作为ASP.NET 5(repo)一部分的SignalR-Server对我的SignalR Hub类进行依赖注入.我试图从这个链接的教程中弄清楚这一点,但我似乎无法确定如何做到这一点,因为它GlobalHost不再可用.这是我正在尝试做的事情:

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
    services.AddSingleton<IState, State>();
}

public void Configure(IApplicationBuilder app)
{
    app.UseSignalR();
}
Run Code Online (Sandbox Code Playgroud)

MyHub.cs

public class MyHub : Hub
{
    public IState State { get; set; }

    // SignalR accepts this parameterless ctor
    public MyHub()
    {
    }

    // SignalR won't use this because it has a parameter
    public MyHub(IState state)
    {
        State = state;
    }
}
Run Code Online (Sandbox Code Playgroud)

如何让SignalR-Server使用MyHub(IState state)构造函数注入所需的依赖项?

Mar*_*cey 2

我设法通过将我的State类添加为IStatein的单例Startup.ConfigureServices,然后ServiceProvider在我的 Startup.cs 类上公开提供一个属性来解决此问题。从那里,我能够GetRequiredService在我的 SignalR Hub 类的构造函数中进行操作。这不是理想的解决方案,希望我能够在平台达到 RC 时调整它以使用构造函数/属性注入。

这是我的代码:

启动.cs

public static IServiceProvider __serviceProvider;

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR();
    services.AddSingleton<IState, State>();
    __serviceProvider = services.BuildServiceProvider();
}

public void Configure(IApplicationBuilder app)
{
    app.UseSignalR();
}
Run Code Online (Sandbox Code Playgroud)

MyHub.cs

public class MyHub : Hub
{
    public IState State { get; set; }

    public MyHub()
    {
        State = (IState) Startup.__serviceProvider.GetRequiredService(typeof (IState));
    }

    public override Task OnConnected()
    {
        State.Clients = Clients;
        State.Groups = Groups;
        return base.OnConnected();
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我能够IState在 内部设置属性并调用实现对象的方法MyHub,从而使我能够将应用程序状态保留在内存中。