跳到主要内容

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 等接口

相关文档