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; } } }