using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace Hncore.Infrastructure.Events
{
///
/// 事件总线
///
public class EventBus
{
private static EventBus _eventBus = null;
public static EventBus Default
{
get { return _eventBus ?? (_eventBus = new EventBus()); }
}
///
/// 定义线程安全集合
///
private readonly ConcurrentDictionary> _eventAndHandlerMapping;
public EventBus()
{
_eventAndHandlerMapping = new ConcurrentDictionary>();
MapEventToHandler();
}
///
///通过反射,将事件源与事件处理绑定
///
private void MapEventToHandler()
{
// Assembly assembly = Assembly.GetEntryAssembly();
var allAssembly = AppDomain.CurrentDomain.GetAssemblies().Where(item => item.FullName.Contains("Microkj."));
if (!allAssembly.Any())
{
return;
}
foreach (var assembly in allAssembly)
{
foreach (var type in assembly.GetTypes())
{
if (!type.IsGenericType && typeof(IEventHandler).IsAssignableFrom(type)) //判断当前类型是否实现了IEventHandler接口
{
Type handlerInterface = type.GetInterface("IEventHandler`1"); //获取该类实现的泛型接口
if (handlerInterface != null)
{
Type eventDataType = handlerInterface.GetGenericArguments()[0]; // 获取泛型接口指定的参数类型
if (_eventAndHandlerMapping.ContainsKey(eventDataType))
{
List handlerTypes = _eventAndHandlerMapping[eventDataType];
handlerTypes.Add(Activator.CreateInstance(type) as IEventHandler);
_eventAndHandlerMapping[eventDataType] = handlerTypes;
}
else
{
var handlerTypes = new List
{
Activator.CreateInstance(type) as IEventHandler
};
_eventAndHandlerMapping[eventDataType] = handlerTypes;
}
}
}
}
}
}
///
/// 手动绑定事件源与事件处理
///
///
///
public void Register(IEventHandler eventHandler)
{
if (_eventAndHandlerMapping.Keys.Contains(typeof (TEventData)))
{
List handlerTypes = _eventAndHandlerMapping[typeof (TEventData)];
if (!handlerTypes.Contains(eventHandler))
{
handlerTypes.Add(eventHandler);
_eventAndHandlerMapping[typeof (TEventData)] = handlerTypes;
}
}
else
{
_eventAndHandlerMapping.GetOrAdd(typeof (TEventData), (type) => new List())
.Add(eventHandler);
}
}
public void Register(Action action) where TEventData : IEventData
{
var actionHandler = new ActionEventHandler(action);
Register(actionHandler);
}
///
/// 手动解除事件源与事件处理的绑定
///
///
///
public void UnRegister(Type eventHandler)
{
List handlerTypes = _eventAndHandlerMapping[typeof (TEventData)];
_eventAndHandlerMapping.GetOrAdd(typeof (TEventData), (type) => new List())
.RemoveAll(t => t.GetType() == eventHandler);
}
///
/// 根据事件源触发绑定的事件处理
///
///
///
public static void Publish(TEventData eventData) where TEventData : IEventData
{
List handlers = Default._eventAndHandlerMapping[typeof (TEventData)];
if (handlers != null && handlers.Count > 0)
{
foreach (var handler in handlers)
{
var eventHandler = handler as IEventHandler;
if (eventHandler.Ansyc)
{
Task.Run(() =>
{
eventHandler.HandleEvent(eventData);
});
}
else
{
eventHandler.HandleEvent(eventData);
}
}
}
}
}
}