FreeSql仓储模式实战:Repository + UnitOfWork最佳实践
FreeSql作为.NET领域功能强大的ORM框架,其仓储模式和UnitOfWork工作单元设计为开发人员提供了优雅的数据访问解决方案。这套架构不仅简化了数据操作,还确保了事务的一致性和数据的安全性。🚀
什么是仓储模式与UnitOfWork?
仓储模式(Repository Pattern)是一种数据访问抽象层,它将数据访问逻辑与业务逻辑分离。而UnitOfWork(工作单元)则负责管理事务和仓储的生命周期,确保多个仓储操作在同一个事务中执行。
核心优势:
- ✅ 业务逻辑与数据访问解耦
- ✅ 统一的数据访问接口
- ✅ 自动事务管理
- ✅ 支持多种数据库类型
FreeSql仓储架构深度解析
从架构图中可以看出,FreeSql的仓储模式位于Crud extend分支,包含以下关键组件:
FreeSql.Repository- 仓储模式核心接口UnitOfWork- 工作单元管理器BaseRepository- 仓储基类实现
三种仓储实现方式详解
1. IFreeSql扩展方法(快速上手)
这是最简单的使用方式,通过IFreeSql的扩展方法直接获取仓储实例:
var songRepository = fsql.GetRepository<Song>();
var userRepository = fsql.GetRepository<User>();
2. 继承BaseRepository(推荐方式)
通过继承BaseRepository实现自定义仓储,这是最灵活且推荐的方式:
public class SongRepository : BaseRepository<Song, int>
{
public SongRepository(IFreeSql fsql) : base(fsql, null, null) {}
// 在这里扩展自定义方法
public List<Song> GetPopularSongs(int count)
{
return Select.Where(a => a.PlayCount > 1000)
.OrderByDescending(a => a.PlayCount)
.ToList();
}
3. 依赖注入方式(企业级应用)
在ASP.NET Core中使用依赖注入配置仓储:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IFreeSql>(fsql);
services.AddFreeRepository(filter => filter
.Apply<ISoftDelete>("SoftDelete", a => a.IsDeleted == false)
.Apply<ITenant>("Tenant", a => a.TenantId == tenantId),
this.GetType().Assembly
);
}
UnitOfWork工作单元实战指南
UnitOfWork是确保数据一致性的关键,它可以将多个仓储操作放在同一个事务中:
using (var uow = fsql.CreateUnitOfWork())
{
var songRepo = uow.GetRepository<Song>();
var userRepo = uow.GetRepository<User>();
// 多个仓储操作在同一个事务中
songRepo.Insert(new Song { Title = "示例歌曲" });
userRepo.Insert(new User { Name = "示例用户" });
uow.Commit(); // 提交事务
}
实际应用场景示例
在SongService中,我们可以看到仓储模式的典型应用:
public class SongService
{
BaseRepository<Song> _repoSong;
BaseRepository<Detail> _repoDetail;
public SongService(BaseRepository<Song> repoSong, BaseRepository<Detail> repoDetail)
{
_repoSong = repoSong;
_repoDetail = repoDetail;
}
[Transactional]
public async Task CreateSongWithDetails(Song song, List<Detail> details)
{
await _repoSong.InsertAsync(song);
foreach(var detail in details)
{
await _repoDetail.InsertAsync(detail);
}
}
数据过滤与安全控制
FreeSql仓储模式支持强大的数据过滤功能,确保数据安全:
// 用户只能操作自己的数据
var userRepository = fsql.GetRepository<User>(a => a.Id == currentUserId);
分表与分库支持
对于大数据量场景,FreeSql仓储支持分表分库:
var logRepository = fsql.GetRepository<Log>(null, oldname => $"{oldname}_{DateTime.Now:yyyyMM}");
最佳实践总结
-
选择合适的仓储实现方式
- 简单场景:使用扩展方法
- 复杂场景:继承BaseRepository
- 企业应用:依赖注入
-
合理使用UnitOfWork
- 多个相关操作使用同一个UnitOfWork
- 及时提交或回滚事务
-
数据安全考虑
- 使用过滤条件保护数据
- 考虑租户隔离需求
-
性能优化
- 合理使用批量操作
- 注意仓储对象生命周期
核心模块路径
- 仓储模式核心:FreeSql.Repository/readme.md
- DbContext支持:FreeSql.DbContext/readme.md
- 示例项目:Examples/aspnetcore_transaction/Services/SongService.cs
FreeSql的仓储模式和UnitOfWork设计为.NET开发者提供了一套完整、安全、高效的数据访问解决方案。无论你是开发小型应用还是企业级系统,这套架构都能满足你的需求。💪
通过合理的架构设计和最佳实践应用,你可以构建出既易于维护又性能优越的应用程序。FreeSql的强大功能让数据访问变得简单而优雅!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考




