Dapper通用仓储应借鉴EF思想而非照搬,核心是泛型约束+手写SQL灵活性:定义IRepository接口(GetById/Find/Insert/Update/Delete),实现类通过特性识别主键与列映射,动态生成安全SQL,支持事务参数,分页由具体方法处理,查询逻辑下沉至具体仓储,连接由DI管理。

用 Dapper 实现通用仓储(Generic Repository)不是要完全照搬 Entity Framework 那套抽象,而是借其思想——统一数据访问入口、减少重复 SQL、提升可测试性与可维护性。核心在于:用泛型约束实体类型,用 Dapper 的轻量扩展能力封装增删改查共性逻辑,同时保留手写 SQL 的灵活性和性能优势。
先明确契约,避免过度设计。一个实用的 IRepository
继承 IDbConnection 或注入 IDbConnectionFactory,避免在类里 new Connection —— 连接生命周期应由调用方或 DI 控制。关键点:
Dapper 本身不提供 IQueryable,所以不要试图在 IRepository 上加 Where、OrderBy 等 LINQ 方法——那会引入表达式树解析,得不偿失。正确做法是:
注册时用作用域生命周期,连接字符串通过工厂创建:
services.AddScoped(typeof(IRepository<>), typeof(Repository<>)); services.AddSingleton<IDbConnectionFactory, SqlConnectionFactory>();
业务中使用:
public class UserService {
private readonly IRepository<User> _userRepo;
public UserService(IRepository<User> userRepo) => _userRepo = userRepo;
public async Task<User> GetByOpenIdAsync(string openId)
=> await _userRepo.FindFirstOrDefaultAsync("WHERE OpenId = @OpenId", new { OpenId = openId });
}注意:通用仓储不替代领域服务,它只是数据搬运工。复杂业务逻辑、跨表一致性、事务边界仍应在 Application Service 层组织。
基本上就这些。不复杂但容易忽略的是连接管理、主键识别健壮性和 SQL 注入防护——所有参数必须走 Dapper 的 parameterized query,绝不用字符串拼接。
以上就是Dapper如何封装通用仓储 Dapper Repository模式实现方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号