asp.net web开发 ASP.NET Core Web API下事件驱动型架构的实(9)

电脑杂谈  发布时间:2018-01-14 13:09:17  来源:网络整理

以下是基于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

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...