【问题标题】:SignalR Dependency Injection for ASP.NET Core v2.0 using Autofac使用 Autofac 的 ASP.NET Core v2.0 的 SignalR 依赖注入
【发布时间】:2018-06-16 07:40:23
【问题描述】:

是否可以使用依赖注入将依赖注入到 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!");
    }
}

我已经搜索了一些网络,但没有任何明显的东西。我 found this tutorial 起初看起来很有希望,直到我意识到这是针对 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>();
    }
}

看起来IHub 接口已经不存在了。我尝试了IHubContext&lt;MyHub&gt;,希望这可能适用于最新版本,但遗憾的是不能。

当我在集线器的构造函数中有依赖项时,集线器不会创建尽管所有依赖项都已使用 Autofac 注册

如何使用最新版本1.0.0.0-alpha2-final 实现这一点?

【问题讨论】:

  • 尽管承认这一点让我很痛苦,但我只是错过了我的一些依赖项的注册 - 这是使用 Hub 而不是 IHub。通过将我的IDependency 分配给控制器构造函数而不是集线器,我能够发现它们没有注册,然后错误很明显。这确实是一种可用于将 DI 与 SignalR(撰写本文时的当前版本)一起使用的方法。

标签: c# dependency-injection asp.net-core autofac asp.net-core-signalr


【解决方案1】:

问题中给出的示例确实适用于 Microsoft.AspNetCore.SignalR1.0.0.0-alpha2-final 版本,只需稍作调整,使用 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();
    }
}

通过将它们分配给控制器来确保满足所有依赖项。我目前不确定如何在使用此方法注入 SignalR 集线器时解决损坏的依赖关系。

【讨论】:

  • SignalR 仅在 Hub 在容器中注册时才注入依赖项。
猜你喜欢
  • 2020-01-06
  • 1970-01-01
  • 2016-09-27
  • 2018-01-16
  • 1970-01-01
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多