项目

Dapper集成方案

Dapper 是一款专为.NET设计的轻量级对象映射器。相比其他ORM工具,Dapper 的 卓越性能 是其核心优势。

虽然您可以在ABP应用中直接使用Dapper,但我们还提供了专门的集成包来简化基于Dapper的仓储类创建。

ABP的Dapper集成包基于Entity Framework Core(EF Core)构建。这意味着该方案假定您将混合使用EF Core和Dapper,其中EF Core作为主数据库提供程序,而在需要精细查询和追求极致性能时使用Dapper。若想了解这样设计的原因,请参阅 这篇技术文章

安装指南

使用 ABP CLIVolo.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 Core DbContext类类型,需按 EF Core文档 进行配置。若使用ABP启动模板创建项目,则已自动完成配置
  • GetAllPersonNamesAsyncUpdatePersonNamesAsync方法声明为virtual,这是启用拦截机制的必要条件
  • 使用GetDbConnectionAsyncGetDbTransactionAsync方法获取由 ABP 工作单元 系统管理的当前数据库连接和事务

随后您可以在任何服务中 注入 PersonDapperRepository来执行数据库操作。对于分层解决方案,建议在领域层定义IPersonDapperRepository接口,在数据层实现该接口,最后通过接口注入方式使用仓储服务。

如需深入了解Dapper与ABP框架的结合使用,请参阅社区技术文章

扩展阅读

在本文档中