有没有做家居服设计师看的网站,如何注册网站名称,开发一个网站需要多少人,网站开发需求分析文档打造更好用的 EF 自动审计Intro上次基于 EF Core 实现了一个自动审计的功能#xff0c;详细可以参考 EF Core 数据变更自动审计设计#xff0c;虽然说多数情况下可以适用#xff0c;但是因为要显式继承于一个 AuditDbContextBase 或 AuditDbContext#xff0c;所以对代码的… 打造更好用的 EF 自动审计Intro上次基于 EF Core 实现了一个自动审计的功能详细可以参考 EF Core 数据变更自动审计设计虽然说多数情况下可以适用但是因为要显式继承于一个 AuditDbContextBase 或 AuditDbContext所以对代码的侵入性比较强对于已经无法修改的代码或者已经继承于某一个类了就无法再继承 AuditDBContext 了就没有办法实现自动审计了在 WeihanLi.EntityFramework 1.7.0 新版本里引入了 AOP 的设计结合 AOP 来实现就简单很多了不再需要对原有的 DbContext 有任何修改就可以轻松实现自动审计了下面来看如何做实例演示服务注册使用 AddProxyDbContext 代替 AddDbContext AddProxyDbContextPool 代替 AddDbContextPool会自动注册代理服务以实现 AOP 拦截var services new ServiceCollection();
// 使用内置的扩展注册 DbContext 代理服务
//services.AddProxyDbContextTestDbContext(options
//{
// options
// .UseLoggerFactory(loggerFactory)
// //.EnableDetailedErrors()
// //.EnableSensitiveDataLogging()
// // .UseInMemoryDatabase(Tests)
// .UseSqlServer(DbConnectionString)
// //.AddInterceptors(new QueryWithNoLockDbCommandInterceptor())
// ;
//});
// 使用内置的扩展注册 DbContextPool 代理服务只是为了方便使用只会代理 DbContext
services.AddProxyDbContextPoolTestDbContext(options
{options.UseLoggerFactory(loggerFactory)//.EnableDetailedErrors()//.EnableSensitiveDataLogging()// .UseInMemoryDatabase(Tests).UseSqlServer(DbConnectionString)//.AddInterceptors(new QueryWithNoLockDbCommandInterceptor());
});
// 注册 AOP 服务
services.AddFluentAspects(options
{// 配置使用 AuditDbContextInterceptor 拦截 DbContext 的 SaveChanges 和 SaveChangesAsync 方法options.InterceptMethodDbContext(m m.Name nameof(DbContext.SaveChanges)|| m.Name nameof(DbContext.SaveChangesAsync)).WithAuditDbContextInterceptor();
});
// 注册 serviceLocator可选根据自己需要
DependencyResolver.SetDependencyResolver(services);
审计配置AuditConfig.Configure(builder
{builder// 配置操作用户获取方式.WithUserIdProvider(EnvironmentAuditUserIdProvider.Instance.Value)//.WithUnModifiedProperty() // 保存未修改的属性,默认只保存发生修改的属性// 保存更多属性.EnrichWithProperty(MachineName, Environment.MachineName).EnrichWithProperty(nameof(ApplicationHelper.ApplicationName), ApplicationHelper.ApplicationName)// 保存到自定义的存储.WithStoreAuditFileStore().WithStoreAuditFileStore(logs0.log)// 忽略指定实体.IgnoreEntityAuditRecord()// 忽略指定实体的某个属性.IgnorePropertyTestEntity(t t.CreatedAt)// 忽略所有属性名称为 CreatedAt 的属性.IgnoreProperty(CreatedAt);
});
使用示例DependencyResolver.TryInvokeServiceTestDbContext(dbContext
{dbContext.Database.EnsureDeleted();dbContext.Database.EnsureCreated();var testEntity new TestEntity(){Extra new { Name Tom }.ToJson(),CreatedAt DateTimeOffset.UtcNow,};dbContext.TestEntities.Add(testEntity);dbContext.SaveChanges();testEntity.CreatedAt DateTimeOffset.Now;testEntity.Extra new { Name Jerry }.ToJson();dbContext.SaveChanges();dbContext.Remove(testEntity);dbContext.SaveChanges();var testEntity1 new TestEntity(){Extra new { Name Tom1 }.ToJson(),CreatedAt DateTimeOffset.UtcNow,};dbContext.TestEntities.Add(testEntity1);var testEntity2 new TestEntity(){Extra new { Name Tom2 }.ToJson(),CreatedAt DateTimeOffset.UtcNow,};dbContext.TestEntities.Add(testEntity2);dbContext.SaveChanges();
});
DependencyResolver.TryInvokeServiceTestDbContext(dbContext
{dbContext.Remove(new TestEntity(){Id 2});dbContext.SaveChanges();
});
// disable audit
AuditConfig.DisableAudit();
// enable audit
// AuditConfig.EnableAudit();
审计日志输出结果More这样一来就不需要修改原有代码了~~心情大好哈哈~如果应用多有多个 DbContext 有的需要审计有的不需要审计则可以在配置的时候指定具体的 DbContext类型如 TestDbContext这样就只会启用 TestDbContext 的自动审计别的 DbContext 比如 Test2DbContext 就不会自动审计了Referencehttps://github.com/WeihanLi/WeihanLi.EntityFramework/blob/dev/samples/WeihanLi.EntityFramework.Core3_0Sample/Program.cshttps://www.nuget.org/packages/WeihanLi.EntityFramework/EF Core 数据变更自动审计设计