一、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):
ObjectsMapper<Source, Destination> mapper = ObjectMapperManager.DefaultInstance.GetMapper<Source, Destination>(); Destination destination = mapper.Map(source);
或者:
Destination destination = new Destination(); 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 简介
Autofac 是一款轻量级的开源 IoC 容器,它主要负责管理类之间的依赖关系、管理对象的生命周期等,降低应用程序组件间的耦合性,提高类、组件的扩展性、可重用性。
3.2、背景
在我们的软件系统中通常都是通过 N 多个对象(系统、模块、对象)的共同协作来最终实现我们的业务系统。N 多个对象的协作肯定会产生或多或少的耦合(依赖),降低对象之间的耦合是我们软件工程永远追求的目标之一。
3.3、依赖倒置原则
a. 上层模块不应该依赖于下层模块,它们应该共同依赖于一个抽象。b. 抽象不应该依赖于具体,具体依赖于抽象。
3.4、IoC
Inversion of Control:控制反转,反转的是对依赖对象的控制权。
如果 A 依赖 B 的话,按照之前的做法是在类 A 中需要 B 的地方主动实例化一个 B 对象。现在的做法是类 A 中需要一个 B 对象,IoC 容器初始化一个 B 对象传给类 A。创建依赖对象的职责从类 A 转移到了 IoC 容器里面。
3.5、依赖注入
可以用不同的方式实现 IoC,其中一种实现策略是依赖注入。那么依赖注入是什么?把耦合从代码中转移到配置文件中,通过一个 IoC 容器,在需要的时候再去形成这个依赖关系,即在程序中把需要的接口实现注入到需要它的类中。这就是依赖注入。
3.6、优点
- a、可维护性好:在通过 IoC 容器创建组件之间的依赖关系之前,这些组件之间是毫不相关的,分别都是独立的单元,便于各自调试和单元测试。
- b、分工明确、提高开发效率:各个组件都是独立的单元,可以由不同的开发团队来开发和维护,大大提高开发效率。
- c、可重用性高:常用的模块都是一个单独的个体,实现了标准的接口,可以插接到任何支持此标准的模块中。
四、DLL 包管理工具
4.1、NuGet 简介
NuGet 是 Visual Studio 的一个扩展。在使用 Visual Studio 开发基于.NET Framework 的应用时,NuGet 能把在项目中添加、移除和更新引用的工作变得更加快捷方便。
4.2、为什么要用 NuGet
- 由于公司内部的公共组件越来越多,为了统一方便管理这些公共组件,所以需要搭建公司内部的 NuGet 服务器。
- DLL 不用上传到 SVN 上,以免造成过多的 DLL 文件被传到 SVN 上,减轻 SVN 压力。
- 方便了包的依赖管理。
- 会及时知道 DLL 是否有更新。
- NuGet 可以自动还原项目引用的包。
4.3、使用方法
1、设置 NuGet 服务器
右键需要添加引用的项目文件 -> 管理 NuGet 程序包,便打开了如下图所示的弹出框,然后点击【设置】按钮:
添加程序包源,即添加公司内部的 NuGet 服务器名和其地址【 http://nuget .*.*/nuget】:
2、添加组件引用
在下图左侧的联机列表中,选中在上步设置的 NuGet 服务器名【***NuGet】,然后在下图中间的列表中选中要添加的引用的组件名,再通过点【安装】按钮把相应的组件引用添加到项目中:
3、更新组件引用
在下图左侧的更新列表中,选中在前面步骤中设置的 NuGet 服务器名【***NuGet】,然后在下图中间的列表中选中要重新添加引用的组件名,再通过点【更新】按钮把相应的组件引用重新添加到项目中:
4、包管理
管理包时需要用到 NuGetPackageExplorer,下载地址:位于本文的【下载资源】处。
新建包:
a、打开 NuGet Package Explorer,单击【创建一个新的组件包】:
b、将需要打包的组件引用拖放到【Package contents】区域:
c、单击位于界面左上角的【Edit Metadata】按钮后,进入如下图所示的编辑界面。
在【Package metadata】区域中编辑好组件的相应信息,然后点绿色的勾,然后点击 FILE->Save 保存;其中,包名(即包 Id 号)的命名规范建议是:{产品线英文名全称}.{AppID}.{***}:
d、组件发布
点击 FILE->Publish 后,在弹出如下图的所示框中,发布地址输入: http://nuget .*.*/,在 Publish Key 文本框处输入密码:
更新包:
a、打开 NuGet Package Explorer,单击从【从在线源中打开一个包】:
b、在 Package source 文本框处默认显示了【 http://nuget .*.*/nuget】,即公司内部的 NuGet 服务器地址,再单击【Reload】按钮;然后,在出现的包列表中选中将要编辑的包,然后双击它或者单击【open】按钮:
c、单击位于界面左上角的【Edit Metadata】按钮后,进入如下图所示的编辑界面。
在编辑界面的【Package metadata】区域中,在【Version】文本框中增大版本号。然后,在编辑界面的【Package contents】区域中,右键需要更新的引用,然后在弹出的快捷菜单中单击【Replace with…】来完成重新上传最新的包的操作:
d、编辑完成之后,单击位于上图左上角的绿色勾,然后单击 FILE->Publish 进行发布工作。
五、资源下载
- Dapper.NETDemo 下载地址: https://github.com/das2017/DapperDemo
- EmitMapperDemo 和 AutoMapperDemo 下载地址: https://github.com/das2017/ObjectMapperDemo
- AutofacDemo 下载地址: https://github.com/das2017/AutofacDemo
- NuGetPackageExplorer 下载地址: https://github.com/NuGetPackageExplorer/NuGetPackageExplorer
六、更多资料
- Dapper.NET: https://github.com/StackExchange/Dapper
- EmitMapper: http://emitmapper.codeplex.com/
- AutoMapper: https://github.com/AutoMapper/AutoMapper
- Autofac 文档: http://docs.autofac.org/en/latest/
- Autofac: https://github.com/autofac/Autofac
作者介绍
杨丽,拥有多年互联网应用系统研发经验,曾就职于古大集团,现任职中青易游的系统架构师,主要负责公司研发中心业务系统的架构设计以及新技术积累和培训。现阶段主要关注开源软件、软件架构、微服务以及大数据。
张辉清,10 多年的 IT 老兵,先后担任携程架构师、古大集团首席架构、中青易游 CTO 等职务,主导过两家公司的技术架构升级改造工作。现关注架构与工程效率,技术与业务的匹配与融合,技术价值与创新。
本系列已经更新了这些文章:
- 开篇:中小型研发团队架构实践三要点
- 缓存 Redis: Redis 快速入门及应用
- 消息队列 RabbitMQ:如何用好消息队列 RabbitMQ?
- 集中式日志 ELK:中小型研发团队架构实践之集中式日志 ELK
- 任务调度 Job:中小型研发团队架构实践之任务调度 Job
- 应用监控 Metrics:应用监控怎么做?
- 微服务框架 MSA:这是你心心念念的.NET 栈的微服务架构实践
- 搜索利器 Solr
- 分布式协调器 ZooKeeper
- 小工具:Dapper.NET/EmitMapper/AutoMapper/Autofac/NuGet
- 发布工具 Jenkins
- 总体架构设计:电商如何做企业总体架构?
- 单个项目架构设计
- 统一应用分层:如何规范公司所有应用分层?
- 调试工具 WinDbg
- 单点登录
- 企业支付网关
- 结篇
感谢雨多田光对本文的审校。
评论