ASP.NET Core v2.0 使用 Autofac 的 SignalR 依赖注入
SignalR Dependency Injection for ASP.NET Core v2.0 using Autofac
是否可以使用依赖注入将依赖注入到 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<MyHub>
,希望这可能适用于最新版本,但遗憾的是不行。
当我在集线器的构造函数中有依赖项时,不会创建集线器 尽管所有依赖项都已在 Autofac.
中注册
如何使用最新版本 1.0.0.0-alpha2-final
实现此目的?
问题中给出的示例确实适用于 Microsoft.AspNetCore.SignalR
的 1.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 集线器时损坏的依赖项。
是否可以使用依赖注入将依赖注入到 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<MyHub>
,希望这可能适用于最新版本,但遗憾的是不行。
当我在集线器的构造函数中有依赖项时,不会创建集线器 尽管所有依赖项都已在 Autofac.
如何使用最新版本 1.0.0.0-alpha2-final
实现此目的?
问题中给出的示例确实适用于 Microsoft.AspNetCore.SignalR
的 1.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 集线器时损坏的依赖项。