/// <summary> /// ClearAllDomainEvents /// </summary> /// <param name="aggregate"></param> public static void ClearAllDomainEvents(BaseDomainEntity aggregate) { aggregate.ClearDomainEvents(); var fields = aggregate.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).Concat(aggregate.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)).ToArray(); foreach (var field in fields) { var isEntity = field.FieldType.IsAssignableFrom(typeof(BaseDomainEntity)); if (isEntity) { var entity = field.GetValue(aggregate) as BaseDomainEntity; ClearAllDomainEvents(entity); } if (field.FieldType != typeof(string) && typeof(IEnumerable).IsAssignableFrom(field.FieldType)) { if (field.GetValue(aggregate) is IEnumerable enumerable) { foreach (var en in enumerable) { if (en is BaseDomainEntity entityItem) { ClearAllDomainEvents(entityItem); } } } } } }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="aggregate"></param> /// <returns></returns> public static List <T> AssertPublishedDomainEvents <T>(BaseDomainEntity aggregate) where T : IBaseDomainEvent { var domainEvents = DomainEventsTestHelper.GetAllDomainEvents(aggregate).OfType <T>().ToList(); if (!domainEvents.Any()) { throw new Exception($"{typeof(T).Name} event not published"); } return(domainEvents); }
/// <summary> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="aggregate"></param> /// <returns></returns> public static T AssertPublishedDomainEvent <T>(BaseDomainEntity aggregate) where T : IBaseDomainEvent { var domainEvent = DomainEventsTestHelper.GetAllDomainEvents(aggregate).OfType <T>().SingleOrDefault(); if (domainEvent == null) { throw new Exception($"{typeof(T).Name} event not published"); } return(domainEvent); }
/// <summary> /// GetAllDomainEvents /// </summary> /// <param name="aggregate"></param> /// <returns></returns> public static List <IBaseDomainEvent> GetAllDomainEvents(BaseDomainEntity aggregate) { List <IBaseDomainEvent> domainEvents = new List <IBaseDomainEvent>(); if (aggregate.DomainEvents != null) { domainEvents.AddRange(aggregate.DomainEvents); } var fields = aggregate.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public).Concat(aggregate.GetType().BaseType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public)).ToArray(); foreach (var field in fields) { var isEntity = field.FieldType.IsAssignableFrom(typeof(BaseDomainEntity)); if (isEntity) { var entity = field.GetValue(aggregate) as BaseDomainEntity; domainEvents.AddRange(GetAllDomainEvents(entity).ToList()); } if (field.FieldType != typeof(string) && typeof(IEnumerable).IsAssignableFrom(field.FieldType)) { if (field.GetValue(aggregate) is IEnumerable enumerable) { foreach (var en in enumerable) { if (en is BaseDomainEntity entityItem) { domainEvents.AddRange(GetAllDomainEvents(entityItem)); } } } } } return(domainEvents); }