public static class ServiceCollectionExtensions
{
public static void AuditValue(AuditValueEventArgs e, ICurrentUser? user)
{
if (e.AuditValueType == AuditValueType.Insert)
{
if (e.Column.CsName == "CreateUserId")
{
e.Value = user?.FindUserId();
}
if (e.Column.CsName == "CreateUserName")
{
e.Value = user?.UserName;
}
if (e.Column.CsName == "CreateTime")
{
e.Value = DateTime.Now;
}
if (e.Column.CsName == "TenantId")
{
e.Value = user?.TenantId;
}
}
else if (e.AuditValueType == AuditValueType.Update)
{
if (e.Column.CsName == "UpdateUserId")
{
e.Value = user?.FindUserId();
}
if (e.Column.CsName == "UpdateUserName")
{
e.Value = user?.UserName;
}
if (e.Column.CsName == "UpdateTime")
{
e.Value = DateTime.Now;
}
}
}
public static IServiceCollection AddFreeSql(this IServiceCollection services, IConfiguration configuration)
{
services.AddCurrentUserAccessor();
IFreeSql fsql = new FreeSqlBuilder()
.UseConnectionString(configuration)
.UseNameConvert(NameConvertType.PascalCaseToUnderscoreWithLower)
.UseAutoSyncStructure(true) //自动同步实体结构到数据库,FreeSql不会扫描程序集,只有CRUD时才会生成表。
.UseMonitorCommand(cmd =>
{
Trace.WriteLine(cmd.CommandText + ";");
})
.Build();
var provider = services.BuildServiceProvider();
var currentAccessor = provider.GetRequiredService<ICurrentUserAccessor>();
fsql.GlobalFilter.ApplyOnly<ISoftDelete>("IsDeleted", a => a.IsDeleted == false);
fsql.GlobalFilter.ApplyOnlyIf<ITenant>("TenantId", () => currentAccessor.CurrentUser?.TenantId != null, a => a.TenantId == currentAccessor.CurrentUser.TenantId);
fsql.Aop.AuditValue += (s, e) =>
{
AuditValue(e, currentAccessor.CurrentUser);
};
services.AddSingleton<IFreeSql>(fsql);
services.AddFreeRepository();
services.AddScoped<UnitOfWorkManager>();
return services;
}
}
"ConnectionStrings": {
"DefaultDB": "4",
"MySql": "Data Source=localhost;Port=3306;User ID=root;Password=root;Initial Catalog=freekit;Charset=utf8mb4;SslMode=none;Max pool size=1;Connection LifeTime=20",
"SqlServer": "Data Source=.;User ID=sa;Password=123456;Integrated Security=True;Initial Catalog=LinCMS;Pooling=true;Min Pool Size=1",
"PostgreSQL": "Host=localhost;Port=5432;Username=postgres;Password=123456; Database=lincms;Pooling=true;Minimum Pool Size=1",
"Oracle": "user id=root;password=root; data source=//127.0.0.1:1521/ORCL;Pooling=true;Min Pool Size=1",
"Sqlite": "Data Source=Identity.db"
},