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
求直播
加工过程就算有虫卵也会烤熟了