写点什么

中小型研发团队架构实践:小工具合集

2018 年 1 月 01 日

一、ORM 工具

1.1、Dapper.NET 简介

Dapper.NET 是个开源的轻型 ORM。它扩展了 IDbConnection 接口的功能,所以只要某类实现 IDbConnection 接口,那么该类对象就能调用到 Dapper.NET 中的方法。提供的 Dapper.dll,支持.NET Framework 4.0 版本及其上版本。

1.2、为什么选择使用 Dapper.NET

  1. 语法十分简单,易学易用。
  2. 无须依赖于具体的数据库工具,它能和所有.NET ado 提供商一起工作,如:MS SQL Server、Oracle、MySQL、PostgreSQL、SQLite、SqlCe、Firebird 等。
  3. 运行速度十分快,接近于 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 包括了如下主题:

  1. 单条记录的增、改、删
  2. 批量增、改、删
  3. Query() 泛型方法的使用
  4. Query() 非泛型方法的使用
  5. QueryMultiple() 方法的使用
  6. ExecuteScalar() 方法的使用
  7. 如何使用 Dapper.DynamicParameters 类。注意:当数据库表字段被设计为 char 类型时,必须给 DbType 传值,且必须赋的是 DbType.AnsiStringFixedLength,否则数据库访问速度会突然变得很慢。
  8. 如何调用存储过程

二、对象映射工具

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);

默认的映射配置器能自动转换以下几种类型:

  1. 使用 ToString() 方法转换任何类型到 string 类型。
  2. 使用 System.Convert 类可使原生类型之间互相转换。
  3. 可空类型转换为值类型或者值类型转换为可空类型。
  4. 枚举类型转换为它的基础类型或者基础类型转换为对应的枚举类型。
  5. 枚举类型转换为 string 类型或者 string 类型转换为枚举类型。
  6. 不同的集合类型之间互相转换(如:Array、ArrayList、List<>、IEnumerable)。
  7. 类转换为结构或者结构转换为类。
  8. 具有内嵌类型成员的复杂类型采用递归方式转换。

使用 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

  1. 由于公司内部的公共组件越来越多,为了统一方便管理这些公共组件,所以需要搭建公司内部的 NuGet 服务器。
  2. DLL 不用上传到 SVN 上,以免造成过多的 DLL 文件被传到 SVN 上,减轻 SVN 压力。
  3. 方便了包的依赖管理。
  4. 会及时知道 DLL 是否有更新。
  5. 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 进行发布工作。

五、资源下载

六、更多资料

作者介绍

杨丽,拥有多年互联网应用系统研发经验,曾就职于古大集团,现任职中青易游的系统架构师,主要负责公司研发中心业务系统的架构设计以及新技术积累和培训。现阶段主要关注开源软件、软件架构、微服务以及大数据。

张辉清,10 多年的 IT 老兵,先后担任携程架构师、古大集团首席架构、中青易游 CTO 等职务,主导过两家公司的技术架构升级改造工作。现关注架构与工程效率,技术与业务的匹配与融合,技术价值与创新。

本系列已经更新了这些文章:

感谢雨多田光对本文的审校。

2018 年 1 月 01 日 17:157597

评论

发布
暂无评论
发现更多内容

php in_array的低性能

架构精进之路

php 3月日更

面试官:线程池中多余的线程是如何回收的?

Java小咖秀

Java 面试 多线程

zookeeper的数据模型详解

大数据技术指南

大数据 zookeeper 28天写作 3月日更

有道精品课实时数据中台建设实践

有道技术团队

大数据

比电脑屏保还酷?在电脑桌面实时显示当前时间。

彭宏豪95

效率 效率工具 时间 应用 桌面时钟

《Redis 核心技术与实战》学习笔记 03

escray

redis 学习笔记 28天写作 3月日更 Redis 核心技术与实战

飞桨刷新分子性质预测榜单,助力AI药物研发

百度大脑

百度 飞桨 AI药物

高效使用Chrome浏览器,你可能不知道的10个技巧。

彭宏豪95

chrome 效率 浏览器 使用技巧

化蛹成蝶,华为云DevCloud助力互联网+转型,重构钢铁产业链

华为云开发者社区

Scrum 代码 华为云 devcloud 敏捷管理

高斯 Redis 在IM场景中的应用

华为云开发者社区

数据库 IM 华为云 GaussDB(for Redis)

这可能是今年最值得入手的一本思维导图书

博文视点Broadview

数仓集群管理:单节点故障RTO机制分析

华为云开发者社区

GaussDB 集群 GaussDB(DWS) RTO 单节点故障

算法喜刷刷之1021删除最外层的括号

Kylin

算法 28天写作 3月日更 21天挑战

图像基本概念,Python 图像算法取经之旅 365 天的第 2 天

梦想橡皮擦

28天写作 3月日更

都在讲Redis主从复制原理,我来讲实践总结

华为云开发者社区

数据库 redis 复制 服务器 非关系型数据库

NA公链双重隐私技术为NAC公链护航涅磐

区块链第一资讯

区块链 公链 挖矿

鲸品堂开篇

鲸品堂

行业资讯 通信 科技

JDBC—连接数据库工具类(JDBC_Utils)

打工人!

Java JDBC java工具类 操作数据库

京东M-PaaS平台之Android组件化系统私有化部署改造实践

京东科技开发者

系统架构 mPaaS

智汇华云 | ArcherOS Stack共享存储虚拟化技术剖析

华云数据

产品的基准线:确定性的产品

boshi

产品设计 研发管理 七日更

Linkis 1.0.0-RC1 版本发布

微众开源

《Out of Tar Pit》总结

陈皓07

区块链数字资产追踪平台解决方案

源中瑞-龙先生

解决方案 #区块链# #资产追踪

智慧物流迎利好,当代电商倒逼传统产业链变革升级

一只数据鲸鱼

物联网 数据可视化 供应链 智慧城市 智慧物流

JDBC—配置SQLyog

打工人!

MySQL JDBC SQLyog

详解 ZooKeeper 数据持久化

HelloGitHub

Java zookeeper ZooKeeper原理

SD-RTN——毫秒级网络加速带来全新的体验

anyRTC开发者

android 5G 音视频 WebRTC RTC

EGG公链——ETFalk开启了新一代去中心化社交革命

币圈那点事

万象:百度的海量多媒体信息处理系统

百度开发者中心

#富媒体# #信息系统#

智慧公安警务重点人员动态管理系统开发,情报研判平台搭建

WX13823153201

演讲经验交流会|ArchSummit 上海站

演讲经验交流会|ArchSummit 上海站

中小型研发团队架构实践:小工具合集-InfoQ