/// <summary> /// https://stackoverflow.com/questions/26355486/entity-framework-6-audit-track-changes /// </summary> /// <param name="context"></param> private void ModifyAuditableEntities(DbContext context) { var now = _dateTime.UtcNow; var user = _identityService?.UserId ?? Guid.Empty; var auditedEntities = context.ChangeTracker.Entries <IEntityAuditable>().ToList(); foreach (var added in auditedEntities.Where(p => p.State == EntityState.Added) .Select(p => p.Entity)) { added.Create(now, user); } foreach (var modified in auditedEntities.Where(p => p.State == EntityState.Modified) .Select(p => p.Entity)) { modified.Change(now, user); } var auditedLogicalRemoveEntities = context .ChangeTracker .Entries <IEntityAuditableLogicalRemove>() .Where(p => p.State == EntityState.Deleted) .ToList(); foreach (var removed in auditedLogicalRemoveEntities) { _customLogger.Verbose($"Logically deleting the entity {removed.Entity.GetType()}"); removed.Entity.Delete(now, user); removed.State = EntityState.Modified; } }
public Task <T> GetOrCreateAsync <T>(string key, Func <Task <T> > generator, TimeSpan?timeSpan = null) { return(_memoryCache.GetOrCreateAsync(key, entry => { _customLogger.Verbose($"Retrieving from cache {key}"); entry.SlidingExpiration = timeSpan; return generator(); })); }
/// <summary> /// /// </summary> /// <param name="request"></param> /// <param name="cancellationToken">Propagates notification that operations should be canceled.</param> /// <param name="next"></param> /// <returns></returns> public Task Handle(TRequest request, CancellationToken cancellationToken, Func <TRequest, CancellationToken, Task> next) { var name = typeof(TRequest).Name; _timer.Start(); var response = next(request, cancellationToken); _timer.Stop(); _logger.Verbose($"TimerBehaviour: {name} ({_timer.ElapsedMilliseconds} milliseconds) {request}"); return(response); }