我目前正在尝试构建一个非常基本的系统,用于将事件分派给dotnet核心应用程序中的多个事件处理程序。我为处理程序提供了一个界面,如下所示:
public interface IEventHandler<TEvent> {
Task Handle(TEvent evt);
}
另一方面,我有一个用于调度事件的接口。
public interface IEventDispatcher {
Task Dispatch<TEvent>(TEvent evt);
}
让我们假设一个事件看起来像这样:
public class FooEvent {
...
}
和两个订阅此事件的处理程序
public class BarHandler : IEventHandler<FooEvent>
{
Task Handle(FooEvent evt) {
...
}
}
public class BazHandler : IEventHandler<FooEvent>
{
Task Handle(FooEvent evt) {
...
}
}
我正在苦苦挣扎的部分与将这些事件分发给所有处理程序有关。简单明了的实现可能看起来像这样,为清楚起见,我按顺序执行处理程序,并忽略此处的错误处理:
public class EventDispatcher : IEventDispatcher {
private readonly IServiceProvider _serviceProvider;
public EventDispatcher(IServiceProvider serviceProvider) {
_serviceProvider = serviceProvider;
}
Task Dispatch<TEvent>(TEvent evt) {
foreach(var handler in _serviceProvider.GetServices<IEventHandler<TEvent>>()) {
await handler.Handle(evt);
}
}
}
最后,现在是解决实际问题的时候了,我希望每个处理程序都有各自独立的作用域。可以像这样简单地为他们创建共享范围:
Task Dispatch<TEvent>(TEvent evt) {
using(var scope = _serviceProvider.CreateScope()) {
foreach(var handler in scope.ServiceProvider
.GetServices<IEventHandler<TEvent>>()) {
await handler.Handle(evt);
}
}
}
简单地说,如何为每个处理程序提供各自的作用域?