在.NET中实现仓储模式(Repository Pattern),核心是把数据访问逻辑从业务代码里抽离出来,用接口定义统一的数据操作契约,再由具体类去实现——这样既方便单元测试,又利于后期切换数据库或添加缓存层。
定义通用仓储接口
先写一个泛型接口 IRepository
基于Entity Framework Core实现仓储
新建 EFCoreRepository
配合工作单元(Unit of Work)提升一致性
单个仓储只管一类实体,多个仓储协作时容易出现事务不一致。引入 IUnitOfWork 接口封装 DbContext 的 SaveChanges:
接口包含各仓储的只读属性,如 IRepository在服务层中使用仓储
业务逻辑不再直接 new DbContext,而是通过构造函数注入 IUnitOfWork 或具体仓储接口:
例如用户注册服务:调用 _unitOfWork.Users.AddAsync(user),再 _unitOfWork.SaveChangesAsync() 查询时可用 _unitOfWork.Orders.GetAll().Where(x => x.Status == "Pending"),但更推荐在仓储中提供带条件的方法(如 GetByStatusAsync),保持职责清晰 单元测试时,用 Moq 模拟 IRepository基本上就这些。不复杂但容易忽略的是:仓储不是万能的,别为了模式而堆砌;简单CRUD用 EF Core 自带的 DbSet 也完全OK;真正需要仓储,是当你开始关注解耦、可测性、多数据源或领域驱动设计(DDD)边界的时候。
