using NCC.Dependency;
using NCC.Extensions;
using NCC.IPCChannel;
using NCC.JsonSerialization;
using NCC.Reflection;
using System;
using System.Reflection;
using System.Threading.Tasks;
namespace NCC.EventBridge
{
///
/// 事件总线静态类
///
[SuppressSniffer]
public static class Event
{
///
/// 发射消息
///
/// 分类名:事件Id
///
///
public static void Emit(string eventCombineId, object payload = default)
{
EmitAsync(eventCombineId, payload).GetAwaiter().GetResult();
}
///
/// 发射消息
///
/// 分类名:事件Id
///
///
public static async Task EmitAsync(string eventCombineId, object payload = default)
{
var eventCombines = eventCombineId?.Split(':', System.StringSplitOptions.RemoveEmptyEntries);
if (eventCombines == null || eventCombines.Length <= 1) throw new InvalidCastException("Is not a valid event combination id.");
// 解析注册的事件存储提供器
var eventStoreProvider = App.GetService();
// 获取事件处理程序元数据
var eventHandlerMetadata = await eventStoreProvider?.GetEventHandlerAsync(eventCombines[0]);
if (eventHandlerMetadata == null) return;
var nonPayload = payload == null;
var payloadType = payload?.GetType();
// 追加一条事件消息
await eventStoreProvider.AppendEventMessageAsync(new EventMessageMetadata
{
AssemblyName = eventHandlerMetadata.AssemblyName,
Category = eventHandlerMetadata.Category,
CreatedTime = DateTimeOffset.UtcNow,
TypeFullName = eventHandlerMetadata.TypeFullName,
EventId = eventCombines[1],
Payload = nonPayload ? default : (payloadType.IsValueType ? payload.ToString() : JSON.Serialize(payload)),
PayloadAssemblyName = nonPayload ? default : Reflect.GetAssemblyName(payloadType),
PayloadTypeFullName = nonPayload ? default : payloadType.FullName,
});
}
///
/// 发射消息
///
///
///
///
///
public static Task EmitAsync(string eventId, object payload = default)
where TEventHandler : class, IEventHandler
{
return EmitAsync($"{GetEventHandlerCategory(typeof(TEventHandler))}:{eventId}", payload);
}
///
/// 发射消息
///
///
///
///
///
public static void Emit(string eventId, object payload = default)
where TEventHandler : class, IEventHandler
{
EmitAsync(eventId, payload).GetAwaiter().GetResult();
}
///
/// 发射消息
///
///
///
public static async Task EmitAsync(EventMessageMetadata eventMessageMetadata)
{
// 反射创建承载数据
var payload = DeserializePayload(eventMessageMetadata);
await ChannelContext.BoundedChannel.Writer.WriteAsync(new EventMessage(eventMessageMetadata.Category, eventMessageMetadata.EventId, payload));
}
///
/// 反序列化承载数据
///
///
///
public static object DeserializePayload(EventMessageMetadata eventMessageMetadata)
{
object payload = null;
// 反序列化承载数据
if (eventMessageMetadata.Payload != null)
{
// 获取承载数据运行时类型
var payloadType = Reflect.GetType(eventMessageMetadata.PayloadAssemblyName, eventMessageMetadata.PayloadTypeFullName);
// 转换承载数据为具体值
if (payloadType.IsValueType) payload = eventMessageMetadata.Payload.ChangeType(payloadType);
else payload = typeof(JSON).GetMethod("Deserialize").MakeGenericMethod(payloadType)
.Invoke(null, new object[] { eventMessageMetadata.Payload, null, null });
}
return payload;
}
///
/// 获取事件处理程序分类名
///
///
///
internal static string GetEventHandlerCategory(Type type)
{
// 如果定义了 [EventHandler] 特性,使用 Category,否则使用类型名(默认去除 EventHandler)结尾
var defaultCategory = type.Name.ClearStringAffixes(1, "EventHandler");
var eventCategory = type.IsDefined(typeof(EventHandlerAttribute), false)
? type.GetCustomAttribute(false).Category ?? defaultCategory
: defaultCategory;
return eventCategory;
}
}
}