我具有以下类定义
public EventBusHandler(IEventBus eventBus, IService service)
{
eventBus.Subscribe<Event>(EventHandler);
}
我需要在每个请求上启动Service类,因为它维护范围,所以我也需要将处理程序类设为单例,因为它不依赖于请求,并且应该可以随时用于处理事件,所以我在我的启动类中包含以下内容
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IEventBus>(EventBus.GetEventBus());
services.AddSingleton<EventBusHandler>();
services.AddScoped<IService, Service>();
}
public override void Configure(IApplicationBuilder app, IHostEnvironment env)
{
app.ApplicationServices.GetRequiredService<EventBusHandler>();
}
但是这会引发错误,因为单例无法引用作用域实例。我的问题是如何构建此结构,因此我可以订阅事件,同时仍然能够引用作用域实例。可能吗?
找到了解决方案。我将构造函数更改为
public EventBusHandler(IEventBus eventBus, IServiceProvider serviceProvider)
然后用于获取IService
var service = serviceProvider.CreateScope().ServiceProvider.GetRequiredService<IService>();