一、ORM 工具 1.1、Dapper.NET 簡介 Dapper.NET是個開源的輕型ORM。它擴展了IDbConnection 介面的功能,所以只要某類實現IDbConnection 介面,那麼該類對象就能調用到 Dapper.NET中的方法。提供的 Dapper.dll,支持.NET Fram ...
一、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 簡介
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,下載地址:位於本文的【下載資源】處。
新建包:
1)、打開 NuGet Package Explorer,單擊【創建一個新的組件包】:
2)、將需要打包的組件引用拖放到【Package contents】區域:
3)、單擊位於界面左上角的【Edit Metadata】按鈕後,進入如下圖所示的編輯界面。
在【Package metadata】區域中編輯好組件的相應信息,然後點綠色的勾,然後點擊FILE->Save保存;其中,包名(即包Id號)的命名規範建議是:{產品線英文名全稱}.{AppID}.{***}:
4)、組件發佈
點擊FILE->Publish後,在彈出如下圖的所示框中,發佈地址輸入:http://nuget.***.***/,在Publish Key文本框處輸入密碼:
更新包:
1)、打開NuGet Package Explorer,單擊從【從線上源中打開一個包】:
2)、在Package source文本框處預設顯示了【http://nuget.***.***/nuget】,即公司內部的NuGet伺服器地址,再單擊【Reload】按鈕;然後,在出現的包列表中選中將要編輯的包,然後雙擊它或者單擊【open】按鈕:
3)、單擊位於界面左上角的【Edit Metadata】按鈕後,進入如下圖所示的編輯界面。
在編輯界面的【Package metadata】區域中,在【Version】文本框中增大版本號。然後,在編輯界面的【Package contents】區域中,右鍵需要更新的引用,然後在彈出的快捷菜單中單擊【Replace with...】來完成重新上傳最新的包的操作:
4)、編輯完成之後,單擊位於上圖左上角的綠色勾,然後單擊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/
轉載鏈接:http://www.infoq.com/cn/articles/architecture-practice-10-Dapper-EmitMapper-AutoMapper-NuGet