以下是基于Microsoft.Extensions.DependencyInjection框架来实现的事件处理器执行上下文完整代码,这里有个兼容性问题,就是构造函数的第二个参数:serviceProviderFactory。在Microsoft.Extensions.DependencyInjection框架2.0版本之前,IServiceCollection.BuildServiceProvider方法的返回类型是IServiceProvider,但从2.0开始,它的返回类型已经从IServiceProvider接口,变成了ServiceProvider类。这里引出了框架设计的另一个原则,就是依赖较低版本的.NET Core,以便获得更好的兼容性。如果我们的EdaSample是使用.NET Core 1.1开发的,那么当下面这个类被直接用在ASP.NET Core 2.0的项目中时,如果不通过构造函数参数传入ServiceProvider创建委托,而是直接在代码中使用registry.BuildServiceProvider调用,就会出现异常。asp.net web开发
public class EventHandlerExecutionContext : IEventHandlerExecutionContext
{
private readonly IServiceCollection registry;
private readonly Func<IServiceCollection, IServiceProvider> serviceProviderFactory;
private readonly ConcurrentDictionary<Type, List<Type>> registrations = new ConcurrentDictionary<Type, List<Type>>();
public EventHandlerExecutionContext(IServiceCollection registry,
Func<IServiceCollection, IServiceProvider> serviceProviderFactory = null )
{
this .registry = registry;
this .serviceProviderFactory = serviceProviderFactory ?? (sc => registry.BuildServiceProvider());
}
public async Task HandleEventAsync(IEvent @ event , CancellationToken cancellationToken = default (CancellationToken))
{
var eventType = @ event .GetType();
if ( this .registrations.TryGetValue(eventType, out List<Type> handlerTypes) &&
handlerTypes?.Count > 0)
{
var serviceProvider = this .serviceProviderFactory( this .registry);
using ( var childScope = serviceProvider.CreateScope())
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-60185-9.html
那就是雄赳赳气昂昂
送他们去见上帝