Dapper集成方案
Dapper 是一款专为.NET设计的轻量级对象映射器。相比其他ORM工具,Dapper 的 卓越性能 是其核心优势。
虽然您可以在ABP应用中直接使用Dapper,但我们还提供了专门的集成包来简化基于Dapper的仓储类创建。
ABP的Dapper集成包基于Entity Framework Core(EF Core)构建。这意味着该方案假定您将混合使用EF Core和Dapper,其中EF Core作为主数据库提供程序,而在需要精细查询和追求极致性能时使用Dapper。若想了解这样设计的原因,请参阅 这篇技术文章 。
安装指南
使用 ABP CLI 将 Volo.Abp.Dapper 包添加到您的项目。在需要安装此包的.csproj文件所在目录执行以下命令:
abp add-package Volo.Abp.Dapper
若尚未安装ABP CLI,请先完成安装。其他安装方式请参见 包详情页面。
对于分层架构解决方案,建议将此包安装至解决方案的数据层。
实现Dapper仓储
使用Dapper的最佳实践是创建封装数据库操作的 仓储类 。以下示例展示了操作People表的新建仓储类:
public class PersonDapperRepository :
DapperRepository<MyAppDbContext>, ITransientDependency
{
public PersonDapperRepository(IDbContextProvider<MyAppDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public virtual async Task<List<string>> GetAllPersonNamesAsync()
{
var dbConnection = await GetDbConnectionAsync();
return (await dbConnection.QueryAsync<string>(
"select Name from People",
transaction: await GetDbTransactionAsync())
).ToList();
}
public virtual async Task<int> UpdatePersonNamesAsync(string name)
{
var dbConnection = await GetDbConnectionAsync();
return await dbConnection.ExecuteAsync(
"update People set Name = @NewName",
new { NewName = name },
await GetDbTransactionAsync()
);
}
}
类结构解析:
- 继承自
DapperRepository类,该类提供了便捷的数据库操作方法和属性。通过实现IUnitOfWorkEnabled接口,ABP会通过动态代理(即拦截机制)在方法体内提供数据库连接(及事务支持) - 构造函数注入
IDbContextProvider<MyAppDbContext>,其中MyAppDbContext是您的EF CoreDbContext类类型,需按 EF Core文档 进行配置。若使用ABP启动模板创建项目,则已自动完成配置 GetAllPersonNamesAsync和UpdatePersonNamesAsync方法声明为virtual,这是启用拦截机制的必要条件- 使用
GetDbConnectionAsync和GetDbTransactionAsync方法获取由 ABP 工作单元 系统管理的当前数据库连接和事务
随后您可以在任何服务中 注入 PersonDapperRepository来执行数据库操作。对于分层解决方案,建议在领域层定义IPersonDapperRepository接口,在数据层实现该接口,最后通过接口注入方式使用仓储服务。
如需深入了解Dapper与ABP框架的结合使用,请参阅社区技术文章
抠丁客


