中小型研發團隊架構實踐四:小工具集合

来源:https://www.cnblogs.com/supersnowyao/archive/2018/01/28/8367782.html
-Advertisement-
Play Games

一、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

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

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

     預設的映射配置器能自動轉換以下幾種類型:

  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,下載地址:位於本文的【下載資源】處。

     新建包:

     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進行發佈工作。

 

五、資源下載

六、更多資料

 

轉載鏈接:http://www.infoq.com/cn/articles/architecture-practice-10-Dapper-EmitMapper-AutoMapper-NuGet


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Jquery實現樹樁導航 展示一下效果? 當我滑鼠點擊的是時候展開下級菜單例如:我點擊汽車 就會顯示奧迪與賓士再次點擊就會閉合 實現思路 1. 實現Ul的搭建,並建立樣式實現隱藏相對應的樣式 2 找到要操作的的對象並添加函數 3找到要操作的對象添加對應的功能 方法的講解 children()指的是子 ...
  • Jquery實現樹樁導航 展示一下效果? 當我滑鼠在導航移動的時候下麵的圖片隨著滑鼠的移動而變化 實現思路 1. 找到要知道要操作的對象並加上相對應的事件 2. 為當前對象添加樣式: 方法的講解 $() jqerry()的簡寫 addClass()添加樣式 siblings() 兄弟們 remove ...
  • 1.姓名只能是漢字 2.簡單的身份證校驗(校驗內容包括數字,位數,以及末尾的x,X) 3.簡單的手機號碼校驗(號碼第二位可以參考運營商定義的號段) 4.簡單的地址防特殊字元校驗 5.特殊鍵位禁止輸入 keycode我就不班門弄斧了,已經有很多大神寫了相關文章,我挑選了易實戰中使用的一篇,請參考鏈接 ...
  • 最近流行微信“跳一跳”小游戲,我也心血來潮寫了一個微信小程式版2048,本篇文章主要分享實現2048的演算法以及註意的點,一起來學習吧!(源碼地址見文章末尾) 最近流行微信“跳一跳”小游戲,我也心血來潮寫了一個微信小程式版2048,本篇文章主要分享實現2048的演算法以及註意的點,一起來學習吧!(源碼地 ...
  • CSS3媒體查詢: 語法: <media_query_list>:<media_query>[,<media_query>] <media_query>:only|not <mediaType> and <expression>[ and <expression>] <expression>:<me ...
  • 約定:1.<meta name="viewport" content="width=device-width">這種標記簡稱"wdw"="width=device-width" 約定:2.viewport簡稱vp 約定:3.常用的屬性會有“★”標誌 都是只讀屬性! 其中Chrome或FF沒通過的屬性 ...
  • 1.比較兩個日期的大小 1 function dateCompare() { 2 var start = document.getElementById("dStart ").value; 3 var end = document.getElementById("dEnd ").value; 4 5 ...
  • 每次我都不想接觸鏈表和樹的操作 這次要求逆轉鏈表結構(javascript) 核心思想是通過先存儲鏈表當前節點的next數據 let tt = tem.next; 使當前的節點的next指向我們設置的新鏈表(開始為null) tem.next = newhead; 更新新鏈表 newhead = t ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...