Lind.DDD.Events事件总线~自动化注册

时间:2023-03-08 16:29:15
Lind.DDD.Events事件总线~自动化注册

回到目录

让大叔兴奋的自动化注册

对于领域事件之前说过,在程序启动时订阅(注册)一些事件处理程序,然后在程序的具体位置去发布(触发)它,这是传统的pub/sub模式的体现,当然也没有什么问题,为了让它支持分布式的场景,我们引用了redis这种存储介质,这一切都早已集成到了Lind.DDD架构中,对些没什么好说的,而今天的重点在于"事件的自动过注册"的理念,这个概念真实在ABP架构中出现了,大叔觉得很不错,所以也集成到了自己的架构中,为些也兴奋了一段时间,其中有解决问题的

Redis只是一种分布式存储介质

对于第一版将事件总线放到内存的情况来说,使用redis这种存储介质确实解决了分布式的事件问题,它可以在更多场合下使用,不用考虑WEB端的负载均衡,不用考虑服务端的存储压力,不用考虑并发时的吞吐量,确实,redis是个存储效率非常高的产物,大叔redis里的事件的Key采用了当前EventData的名字加上自定义的前缀,这样可以同时在多个项目中使用.

     /// <summary>
/// 对于事件数据的存储,目前采用内存字典
/// </summary>
private readonly IRedisClient _redisClient = RedisManager.GetClient();
/// <summary>
/// redis事件总线的Key
/// </summary>
private string redisKey = ConfigConstants.ConfigManager.Config.DomainEvent.RedisKey;
/// <summary>
/// 得到当前redis-eventbus-key
/// </summary>
/// <typeparam name="TEvent"></typeparam>
/// <returns></returns>
private string GetCurrentRedisKey<TEvent>()
{
return redisKey + "_" + typeof(TEvent).FullName;
}
/// <summary>
///得到非泛型版本的值
/// </summary>
/// <param name="tEvent"></param>
/// <returns></returns>
private string GetCurrentRedisKey(Type tEvent)
{
return redisKey + "_" + tEvent.FullName;
}

结构图

aaarticlea/png;base64,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" alt="" />

主角是SubscribeAll这个方法

对于当前应用程序下的所有DLL进行反射,拿到所有实现了IEventHandler的类型,然后对这么类型(事件处理程序)进行注册即可.

核心代码(Memory版):

     /// <summary>
/// 需要过滤的接口
/// </summary>
string[] Excepts = { "IEventHandler`1", "ActionDelegatedEventHandler`1" };
/// <summary>
/// 全局统一注册所有事件处理程序,实现了IEventHandlers的
/// </summary>
public void SubscribeAll()
{
var types = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes()
.Where(t => t.GetInterfaces().Contains(typeof(IEventHandlers))))
.Where(i => !Excepts.Contains(i.Name))
.ToArray(); foreach (var item in types)
{
if (!item.ContainsGenericParameters)
{
var en = Activator.CreateInstance(item);
foreach (var t in item.GetInterfaces().Where(i => i.Name != "IEventHandlers"))
{
Subscribe(t, en);
}
}
}
}
/// <summary>
/// 订阅非泛型版
/// </summary>
/// <param name="type"></param>
/// <param name="eventHandler"></param>
void Subscribe(Type type, object eventHandler)
{
lock (_objLock)
{
var eventType = type.GetGenericArguments()[];
//var eventType = type.GetType().GenericTypeArguments[0];
if (_eventHandlers.ContainsKey(eventType))
{
var handlers = _eventHandlers[eventType];
if (handlers != null)
{
if (!handlers.Exists(deh => _eventHandlerEquals(deh, eventHandler)))
handlers.Add(eventHandler);
}
else
{
handlers = new List<object>();
handlers.Add(eventHandler);
}
}
else
_eventHandlers.Add(eventType, new List<object> { eventHandler });
}
}

对于这种仓储,在Redis里事实上是以二进制的格式存储的,所以要求你的EventData和EventHandler需要标记为可序列化,我经过测试,对于Json序列化的方式,在进行发布时,不能成功回调"订阅"的代码,原因我目前还不清楚,需要大家一起去研究!

aaarticlea/png;base64,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" alt="" />

感谢各位的阅读!

回到目录