public static void AuditTrack(this AppStorageContext ctx, IWorkContext workContext)
        {
            if (workContext == null)
            {
                return;
            }

            var now = DateTime.Now;

            var addedAuditedEntities = ctx.ChangeTracker.Entries <ReadModelBase>()
                                       .Where(p => p.State == EntityState.Added)
                                       .Select(p => p.Entity);

            var modifiedAuditedEntities = ctx.ChangeTracker.Entries <ReadModelBase>()
                                          .Where(p => p.State == EntityState.Modified)
                                          .Select(p => p.Entity);

            if (!modifiedAuditedEntities.Any() && !addedAuditedEntities.Any())
            {
                return;
            }

            var currentUser = workContext.CurrentUser ?? "System";

            foreach (var added in addedAuditedEntities)
            {
                added.CreatedBy   = currentUser;
                added.CreatedDate = now;
                added.Deleted     = false;
            }

            foreach (var modified in modifiedAuditedEntities)
            {
                modified.ModifiedBy   = currentUser;
                modified.ModifiedDate = now;

                if (modified is ISoftDelete)
                {
                    if (modified.Deleted.HasValue && modified.Deleted.Value)
                    {
                        modified.DeletedBy   = currentUser;
                        modified.DeletedDate = now;
                    }
                }
            }
        }
        public static async Task DispatchDomainEventsAsync(this AppStorageContext ctx, IMediator mediator)
        {
            var domainEntities = ctx.ChangeTracker
                                 .Entries <ReadModelBase>()
                                 .Where(x => x.Entity.DomainEvents != null && x.Entity.DomainEvents.Any());

            var domainEvents = domainEntities
                               .SelectMany(x => x.Entity.DomainEvents)
                               .ToList();

            domainEntities.ToList()
            .ForEach(entity => entity.Entity.ClearDomainEvents());

            var tasks = domainEvents
                        .Select(async d => await mediator.Publish(d));

            await Task.WhenAll(tasks);
        }