IGeekFan.FreeKit.Extras
FreeSql 应用基础设施,提供仓储、事务、当前用户、Autofac 自动注册。
功能概览
| 功能 | 说明 |
|---|---|
| FreeSql 仓储 | 泛型仓储 CRUD、分页查询 |
| 事务支持 | 工作单元与事务管理 |
| 当前用户 | CurrentUser 获取当前登录用户信息 |
| Autofac 集成 | 自动注册 IScopedDependency 等接口 |
| 审计填充 | 自动填充 CreateTime/UpdateTime 等审计字段 |
安装
dotnet add package IGeekFan.FreeKit.Extras
dotnet add package FreeSql.Provider.Sqlite # 或其他 Provider
快速开始
// Program.cs
var builder = WebApplication.CreateBuilder(args);
// 1. 注册 FreeSql
builder.Services.AddSingleton<IFreeSql>(sp =>
{
var fsql = new FreeSqlBuilder()
.UseConnectionString(DataType.Sqlite, "Data Source=app.db")
.UseAutoSyncStructure(true)
.Build();
fsql.GlobalFilter.Apply<ISoftDelete>("IsDeleted", a => a.IsDeleted == false);
return fsql;
});
// 2. 注册 FreeKit
builder.Services.AddFreeKitCore();
builder.Services.AddUnitOfWorkManager();
// 3. MVC 加事务过滤器
builder.Services.AddControllers(options =>
{
options.Filters.AddService(typeof(UnitOfWorkActionFilter));
});
// 4. Autofac 自动注册
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>((_, cb) =>
{
cb.RegisterModule(new FreeKitModule([typeof(Program).Assembly]));
cb.RegisterModule(new UnitOfWorkModule([typeof(Program).Assembly]));
});
var app = builder.Build();
// 5. 中间件顺序(重要)
app.UseAuthentication();
app.UseCurrentUserAccessor();
app.UseAuthorization();
app.MapControllers();
app.Run();
当前用户
场景:记录操作人
public class ArticleService : IScopedDependency
{
private readonly ICurrentUser _currentUser;
public ArticleService(ICurrentUser currentUser)
{
_currentUser = currentUser;
}
public async Task CreateAsync(string title)
{
var article = new Article { Title = title };
// CreateUserId 和 CreateTime 自动填充
await _fsql.InsertAsync(article);
}
}
ICurrentUser 接口
| 属性 | 说明 |
|---|---|
UserId | 当前用户 ID |
UserName | 用户名 |
IsAuthenticated | 是否已认证 |
事务
场景:多表原子操作
[Transactional]
public async Task TransferAsync(Guid fromId, Guid toId, decimal amount)
{
var from = await _repo.FindAsync(fromId);
var to = await _repo.FindAsync(toId);
from.Balance -= amount;
to.Balance += amount;
await _repo.UpdateAsync(from);
await _repo.UpdateAsync(to);
// 异常自动回滚
}
事务配置
| 特性 | 说明 |
|---|---|
[Transactional] | 默认新事务 |
[Transactional(IsDisabled = true)] | 禁用事务 |
[Transactional(Propagation = Propagation.ReQUIRES_NEW)] | 总是新事务 |
仓储
public class ArticleService : IScopedDependency
{
private readonly IFreeSql _fsql;
public ArticleService(IFreeSql fsql) => _fsql = fsql;
public async Task<List<Article>> GetListAsync()
{
return await _fsql.Select<Article>().ToListAsync();
}
public async Task<Article> CreateAsync(string title)
{
var article = new Article { Title = title };
await _fsql.InsertAsync(article);
return article;
}
public async Task DeleteAsync(Guid id)
{
// 软删除
await _fsql.Delete<Article>().Where(a => a.Id == id).ExecuteAffrowsAsync();
}
}
适用边界
| 适合 | 不适合 |
|---|---|
| FreeSql ORM 应用 | 不使用 FreeSql |
| 需要审计仓储和当前用户 | 只需实体约定 |
| Autofac 约定式注册 | 极简应用 |
故障排查
| 问题 | 解决方案 |
|---|---|
ICurrentUser 为空 | 确保 UseCurrentUserAccessor() 在认证之后 |
[Transactional] 未生效 | 检查 Autofac 注册和过滤器 |
| 审计值未填充 | 检查 fsql.Aop.AuditValue 配置 |
| 自动注册失败 | 确保实现 IScopedDependency 等接口 |