ASP.NET Core 中的 ORM 之 Dapper

ASAformairuan 2019-03-24

Dapper简介

Dapper是.NET的一款轻量级ORM工具(GitHub),也可称为简单对象映射器。在速度方面拥有微型ORM之王的称号。

它是半自动的,也就是说实体类和SQL语句都要自己写,但它提供自动对象映射。是通过对IDbConnection接口的扩展来操作数据库的。

优点

  • 轻量,只有一个文件
  • 性能高,Dapper的速度接近与IDataReader,取列表的数据超过了DataTable。
  • 支持多种数据库。Dapper可以在所有Ado.net Providers下工作,包括sqlite, sqlce, firebird, oracle, MySQL, PostgreSQL and SQL Server
  • 使用Dapper可以自动进行对象映射,通过Emit反射IDataReader的序列队列,来快速的得到和产生对象

使用Dapper

下面简单创建一个Web API应用并通过Dapper访问MySQL数据。

  1. 创建MySQL测试数据

ASP.NET Core 中的 ORM 之 Dapper

创建Web API应用并添加NuGet引用

Install-Package MySql.Data

Install-Package Dapper

新建一个Product类

ASP.NET Core 中的 ORM 之 Dapper

新建一个DBConfig类用于创建并返回数据库连接

ASP.NET Core 中的 ORM 之 Dapper

创建简单的仓储接口和类

ASP.NET Core 中的 ORM 之 Dapper

ASP.NET Core 中的 ORM 之 Dapper

在Startup ConfigureServices方法里面配置依赖注入

ASP.NET Core 中的 ORM 之 Dapper

在Controller里面调用仓储方法

ASP.NET Core 中的 ORM 之 Dapper

  1. 测试API是否可以正常工作
  2. Dapper对存储过程和事务的支持
  3. 存储过程

ASP.NET Core 中的 ORM 之 Dapper

事务

ASP.NET Core 中的 ORM 之 Dapper

Dapper对多表映射的支持

ASP.NET Core 中的 ORM 之 Dapper

使用Dapper Contrib或其他扩展

Dapper Contrib扩展Dapper提供了CRUD的方法

  • Get
  • GetAll
  • Insert
  • Update
  • Delete
  • DeleteAll
  1. 添加NuGet引用Dapper.Contrib
Install-Package Dapper.Contrib
  1. 为Product类添加数据注解

ASP.NET Core 中的 ORM 之 Dapper

增加一个新的仓储类继承

ASP.NET Core 中的 ORM 之 Dapper

  1. 修改Startup ConfigureServices方法里面配置依赖注入
services.AddTransient<IProductRepository, ContribProductRepository>();
  1. 测试,这样可以少写了不少基本的SQL语句。
  2. 其他一些开源的Dapper扩展

类库提供的方法Dapper.SimpleCRUDGet GetList GetListPaged Insert Update Delete DeleteList RecordCountDapper PlusBulk Insert Bulk Delete Bulk Update Bulk Merge Bulk Action Async Bulk Also Action Bulk Then ActionDapper.FastCRUDGet Find Insert Update BulkUpdate Delete BulkDelete CountDapper.MapperMulti-mapping

引入工作单元Unit of Work

仓储模式往往需要工作单元模式的介入来负责一系列仓储对象的持久化,确保数据完整性。网上关于工作单元模式的实现方式有多种,但其本质都是工作单元类通过创建一个所有仓储共享的数据库上下文对象,来组织多个仓储对象。

网上的一些实现方式:

  • Implementing the Repository and Unit of Work Patterns in an ASP.NET MVC Application
  • 微软之前给出的一个示例,仓储类做为工作单元的变量,并通过工作单元传入一致的context参数创建。
  • DDD 领域驱动设计-谈谈 Repository、IUnitOfWork 和 IDbContext 的实践
  • 博客园一位大神的总结,最终采用的方案是仓储类负责查询,工作单元类负责增删改等数据持久化操作。

优缺点不作讨论,适合自己的就是最好的,这里采用了另外一种实现方式:

  • 定义DapperDBContext

ASP.NET Core 中的 ORM 之 Dapper

后面省略了很多代码,有兴趣通过阅读原文到博客上去阅读。

原文地址: https://www.cnblogs.com/royzshare/p/9522127.html

相关推荐