在dotnet core中使用DI为多个实例创建多个作用域

时间:2018-08-15 21:47:48

标签: dependency-injection .net-core

我目前正在尝试构建一个非常基本的系统,用于将事件分派给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);
        }
    }
}

简单地说,如何为每个处理程序提供各自的作用域?

0 个答案:

没有答案