diff --git a/src/WeihanLi.Common/Event/EventBase.cs b/src/WeihanLi.Common/Event/EventBase.cs index 1ae94979..eb96d25b 100644 --- a/src/WeihanLi.Common/Event/EventBase.cs +++ b/src/WeihanLi.Common/Event/EventBase.cs @@ -67,26 +67,60 @@ public interface IEvent public class EventWrapper : IEvent, IEvent { public required T Data { get; init; } - object? IEvent.Data => (object?)Data; + object? IEvent.Data => Data; public required EventProperties Properties { get; init; } } -public static class EventBaseExtensions +public static class EventExtensions { - private static readonly JsonSerializerSettings EventSerializerSettings = JsonSerializeExtension.SerializerSettingsWith(s => - { - s.TypeNameHandling = TypeNameHandling.Objects; - }); + private static readonly JsonSerializerSettings EventSerializerSettings = JsonSerializeExtension + .SerializerSettingsWith(s => + { + s.NullValueHandling = NullValueHandling.Ignore; + s.TypeNameHandling = TypeNameHandling.Objects; + }); public static string ToEventMsg(this TEvent @event) { Guard.NotNull(@event); - return @event.ToJson(EventSerializerSettings); + return GetEvent(@event).ToJson(EventSerializerSettings); + } + + private static IEvent GetEvent(this TEvent @event) + { + if (@event is IEvent eventEvent) + return eventEvent; + + if (@event is IEventBase eventBase) + return new EventWrapper() + { + Data = @event, + Properties = new() + { + EventAt = eventBase.EventAt, + EventId = eventBase.EventId + } + }; + + return new EventWrapper + { + Data = @event, + Properties = new EventProperties + { + EventAt = DateTimeOffset.Now + } + }; } - public static IEventBase ToEvent(this string eventMsg) + public static IEventBase ToEventBase(this string eventMsg) { Guard.NotNull(eventMsg); return eventMsg.JsonToObject(EventSerializerSettings); } + + public static IEvent ToEvent(this string eventMsg) + { + Guard.NotNull(eventMsg); + return eventMsg.JsonToObject(EventSerializerSettings); + } }