使用Autofac的ASP.NET Core v2.0的SignalR依赖注入

Luk*_*uke 6 c# dependency-injection autofac asp.net-core asp.net-core-signalr

是否可以使用依赖注入将依赖注入到ASP.NET Core v2.0上的SignalR中?

假设以下集线器和依赖:

public MyHub : Hub {

    private readonly IMyDependency dependency;

    public MyHub(IMyDependency dependency) {
        this.dependency = dependency;
    }
}

public void MyDependency : IDependency
{
    public void MyMethod() {
        Console.WriteLine("I'm a dependency!");
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经浏览了一下网络,并没有任何明显的东西.我发现这个教程起初看起来很有希望,直到我意识到它Microsoft.AspNetCore.SignalR.Server最终没有发布.

目前,我使用Autofac进行以下设置,但它无法正常工作:

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        services.AddMvc();
        services.AddSignalR();

        // Configue Autofac
        var containerBuilder = new ContainerBuilder();

        containerBuilder.RegisterModule<MyModule>();

        // Configure SignalR hubs for dependency injection
containerBuilder.RegisterSignalRHubs(typeof(Startup).GetTypeInfo().Assembly);

        containerBuilder.Populate(services);
        var container = containerBuilder.Build();
        return new AutofacServiceProvider(container);
    }
}

public static class AutoFacExtensions
{
    public static IRegistrationBuilder<object, ScanningActivatorData, DynamicRegistrationStyle> RegisterSignalRHubs(this ContainerBuilder builder, params Assembly[] assemblies)
    {
        return builder.RegisterAssemblyTypes(assemblies)
            .Where(t => typeof(IHub).IsAssignableFrom(t))
            .ExternallyOwned();
    }
}

public class MyModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<MyDependency>().As<IMyDependency>();
    }
}
Run Code Online (Sandbox Code Playgroud)

看起来IHub界面不再存在了.我试着IHubContext<MyHub>希望这可能适用于最新版本,但遗憾的是没有.

当我在hub的构造函数中有依赖项时,尽管在Autofac中注册了所有依赖项,但仍未创建集线器.

如何用最新版本实现这一目标1.0.0.0-alpha2-final

Luk*_*uke 7

在这个问题给出的例子并配版工作1.0.0.0-alpha2-finalMicrosoft.AspNetCore.SignalR一个轻微的调整,使用Hub而不是现在不存在的IHub.

public static class AutoFacExtensions
{
    public static IRegistrationBuilder<object, ScanningActivatorData, DynamicRegistrationStyle> RegisterSignalRHubs(this ContainerBuilder builder, params Assembly[] assemblies)
    {
        // typeof(Hub), not typeof(IHub)
        return builder.RegisterAssemblyTypes(assemblies)
            .Where(t => typeof(Hub).IsAssignableFrom(t))
            .ExternallyOwned();
    }
}
Run Code Online (Sandbox Code Playgroud)

通过将它们分配给控制器,确保满足所有依赖项.我不确定此时如何使用此方法注入SignalR集线器时对已损坏的依赖项进行故障排除.