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

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

OMG!由于构造函数注入,使得对象之间产生了依赖关系,从而影响到了它们的生命周期,这可怎么办?既然问题是由依赖引起的,那么就需要想办法解耦。

解耦!解决事件处理器对象生命周期问题

经过分析,我们需要解除PassThroughEventBus对各种EventHandler的直接依赖。因为PassThroughEventBus是单例的,那么由它引用的所有组件也只可能具有相同的生命周期。然而,这样的解耦又该如何做呢?将EventHandler封装到另一个类中?结果还是一样,PassThroughEventBus总会通过某种对象关系,来间接引用到EventHandler上,造成EventHandler全局唯一。

或许,应该要有另一套生命周期管理体系来管理EventHandler的生命周期,使得每当PassThroughEventBus需要使用EventHandler对所订阅的事件进行处理的时候,都会通过这套体系来请求新的EventHandler实例,这样一来,PassThroughEventBus也就不再依赖于某个特定的实例了,而仅仅是引用了各种EventHandler在新的生命周期管理体系中的注册信息。每当需要的时候,PassThroughEventBus都会将事件处理器的注册信息传给新的管理体系,然后由这套新的体系来维护事件处理器的生命周期。

通过阅读微软官方的eShopOnContainers案例代码后,证实了这一想法。在案例中,有如下代码:

// namespace Microsoft.eShopOnContainers.BuildingBlocks.EventBusRabbitMQ

private async Task ProcessEvent( string eventName, string message)

{

if (_subsManager.HasSubionsForEvent(eventName))

{

using ( var scope = _autofac.BeginLifetimeScope(AUTOFAC_SCOPE_NAME))

{

var subions = _subsManager.GetHandlersForEvent(eventName);

foreach ( var subion in subions)

{

if (subion.IsDynamic)

{

var handler = scope.ResolveOptional(subion.HandlerType) as IDynamicIntegrationEventHandler;

dynamic eventData = JObject.Parse(message);

await handler.Handle(eventData);

}

else

{

var eventType = _subsManager.GetEventTypeByName(eventName);

var integrationEvent = JsonConvert.DeserializeObject(message, eventType);

var handler = scope.ResolveOptional(subion.HandlerType);

var concreteType = typeof (IIntegrationEventHandler<>).MakeGenericType(eventType);

await (Task)concreteType.GetMethod( "Handle" ).Invoke(handler, new object [] { integrationEvent });


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-60185-7.html

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

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