/// <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;
}
/// <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()[0];
//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 });
}
}