一、ORM 工具
1.1、Dapper.NET 简介
Dapper.NET是个开源的轻型ORM。它扩展了IDbConnection 接口的功能,所以只要某类实现IDbConnection 接口,那么该类对象就能调用到 Dapper.NET中的方法。提供的 Dapper.dll,支持.NET Framework 4.0 版本及其上版本。
1.2、为什么选择使用 Dapper.NET
- 语法十分简单,易学易用。
- 无须依赖于具体的数据库工具,它能和所有.NET ADO提供商一起工作,如:MS SQL Server、Oracle、MySQL、PostgreSQL、SQLite、SqlCe、Firebird 等。
- 运行速度十分快,接近于IDataReader,因为它的映射工作原理是通过 Emit 反射 IDataReader 的序列队列,来快速地产生对象。如下两表显示的数据(数据由官网提供)体现了它的性能优势。
Performance of SELECT mapping over 500 iterations - POCO serialization:
Performance of SELECT mapping over 500 iterations - dynamic serialization:
1.3、如何使用 Dapper.NET
提供的 Demo都是关于Dapper.NET的最最基本的用法。首先,在你需要用到 Dapper.NET 的项目中引用Dapper.dll,请见下图。然后在需要使用Dapper.NET的代码文件中加上【using Dapper;】。
提供的 Demo 包括了如下主题:
- 单条记录的增、改、删;
- 批量增、改、删;
- Query() 泛型方法的使用;
- Query() 非泛型方法的使用;
- QueryMultiple() 方法的使用;
- ExecuteScalar() 方法的使用;
- 如何使用 Dapper.DynamicParameters类。注意:当数据库表字段被设计为 char 类型时,必须给DbType传值,且必须赋的是 DbType.AnsiStringFixedLength,否则数据库访问速度会突然变得很慢;
- 如何调用存储过程;
二、对象映射工具
2.1、为什么需要使用对象映射工具
比如,为了能够从数据库中获取数据,某一个基于 Windows Communication Service 的服务需要将数据库实体对象映射到数据协议对象上。对象--对象映射的一种传统做法就是创建许多数据转换对象。这些对象负责在众多数据对象之间复制数据。对于拥有大量数据对象的程序而言,开发人员需要花费大量的时间精力编写大量的数据转换对象来支持数据对象映射。这一过程非常无聊沉闷,而且容易出现 Bug。而如果你使用对--对象映射工具,就不需要自己编写那些数据转换对象。
2.2、EmitMapper 和 AutoMapper 简介
EmitMapper 和 AutoMapper 都是支持对--对象映射的开源工具,主要负责将一个数据对象的数据映射到另外一个数据对象上。提供的 EmitMapper.dll,支持.NET Framework 3.5 版本及其上版本;提供的 AutoMapper.dll,支持.NET Framework 4.5 版本及其上版本。
2.3、EmitMapper 的使用方法
首先,在需要使用 EmitMapper 的项目中引用 EmitMapper.dll。
基本的使用方法:采用默认的映射配置器 DefaultMapConfig 完成映射操作,不需要指定任何的映射策略。写法主要如下(完整写法请见 BasicUsageDemo.cs):
1 ObjectsMapper<Source, Destination> mapper = ObjectMapperManager.DefaultInstance.GetMapper<Source, Destination>(); 2 Destination destination = mapper.Map(source);
或者:
1 Destination destination = new Destination(); 2 ObjectMapperManager.DefaultInstance.GetMapper<Source, Destination>().Map(source, destination);
默认的映射配置器能自动转换以下几种类型:
- 使用 ToString() 方法转换任何类型到 string 类型。
- 使用 System.Convert 类可使原生类型之间互相转换。
- 可空类型转换为值类型或者值类型转换为可空类型。
- 枚举类型转换为它的基础类型或者基础类型转换为对应的枚举类型。
- 枚举类型转换为 string 类型或者 string 类型转换为枚举类型。
- 不同的集合类型之间互相转换(如:Array、ArrayList、List<>、IEnumerable)。
- 类转换为结构或者结构转换为类。
- 具有内嵌类型成员的复杂类型采用递归方式转换。
使用 DefaultMapConfig 的自定义配置方法:
如果默认的转换满足不了需求,那么可考虑调用 DefaultMapConfig 提供的配置方法。下表说明了各配置方法的作用:
2.4、AutoMapper 的使用方法
首先,在需要使用 AutoMapper 的项目中引用 AutoMapper.dll。
提供的 Demo 主要包括如下主题:
- 最基本的用法(写了 3 种)
- 扁平化映射
- 前后映射
- 空值替换
- 忽略映射
- 条件映射
- 指定映射字段
- 强类型对象映射动态对象
- 动态对象映射动态对象
- 自定义类型转换器
- 自定义解析器
2.5、EmitMapper 和 AutoMapper 的优缺点
EmitMapper 和 AutoMapper 各有千秋:
EmitMapper 官网上虽然有多年的时间没有更新,但它的性能却十分高(接近硬编码)。下图显示的结果是通过笔者电脑运行出来的结果,发现 EmitMapper 的映射速度比 AutoMapper 的快很多(被比较的 AutoMapper 版本号是 5.1.1)。
AutoMapper 虽然性能比不过 EmitMapper,但官网上一直保持着更新状态。
三、IoC 工具
3.1、Autofac 简介