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?
在这个问题给出的例子并配版工作1.0.0.0-alpha2-final的Microsoft.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集线器时对已损坏的依赖项进行故障排除.
| 归档时间: |
|
| 查看次数: |
2146 次 |
| 最近记录: |