Automapper實現自動映射

来源:http://www.cnblogs.com/NikoRanger/archive/2017/09/28/7605250.html
-Advertisement-
Play Games

出於安全考慮,在後臺與前臺進行數據傳輸時,往往不會直接傳輸實體模型,而是使用Dto(Data transfer object 數據傳輸對象),這樣在後臺往前臺傳遞數據時可以省略不必要的信息,只保留必要的信息,大大增強數據安全性。 下麵給出兩個相互對應的關係模型User、UserDto public ...


出於安全考慮,在後臺與前臺進行數據傳輸時,往往不會直接傳輸實體模型,而是使用Dto(Data transfer object 數據傳輸對象),這樣在後臺往前臺傳遞數據時可以省略不必要的信息,只保留必要的信息,大大增強數據安全性。

下麵給出兩個相互對應的關係模型User、UserDto

public class User
{
    private const int NameMaxLength = 20;

    private const int PassWordMaxLength = 16;

    [Key]
    public long Id { get; }


    [MaxLength(NameMaxLength)]
    public string Name { get; set; }

    [MaxLength(PassWordMaxLength)]
    [DataType(DataType.Password)]
    public string PassWord { get; set; }
}

public class UserDto
{
    private const int NameMaxLength = 20;

    private const int PassWordMaxLength = 16;

    [MaxLength(NameMaxLength)]
    public string Name { get; set; }

    [MaxLength(PassWordMaxLength)]
    public string PassWord { get; set; }
}

這裡將 Id 定義為自增長主鍵,在註冊頁面,這個 Id 應不可見,這個時候使用Dto的好處就體現出來了,這個時候,在存入資料庫時會涉及到 UserDtoUser 的類型轉換,按照之前的經驗,肯定可以按照下麵這樣來寫:

user.Name=userDto.Name;
user.PassWord=UserDto.PassWord;

這樣的轉換固然可以,但是如果一個 User 對象足夠複雜,有十幾個甚至二十幾個屬性,這個時候這種寫法就會顯得十分笨拙。

這個時候我們就可以藉助AutoMapper來幫助我們完成 UserDtoUser 的轉換了。

首先安裝Nuget包

在 Tools - Nuget Package Manage - Package Manage Console 輸入

Install-Package AutoMapper 

安裝相應的Nuget包。

根據 Github 上給出的幫助文檔來看,有兩種方法可以創建映射,一種是靜態的 Initalize 一種是動態創建。

下麵使用兩種不同的方法來進行單元測試

    public void Using_Initlalize_Test()
    {
        UserDto dto = new UserDto
        {
            Name = "Niko",
            PassWord = "1234",
        };
        Mapper.Initialize(ctx => ctx.CreateMap<UserDto, User>());
        User user = Mapper.Map<UserDto, User>(dto);
        user.Name.ShouldBe("Niko");
        user.PassWord.ShouldBe("1234");
        user.Id.ToString().ShouldBe("0");
    }

    public  void Using_MapperConfiguration_Test()
    {
        var config = new MapperConfiguration(ctx => ctx.CreateMap<UserDto, User>());
        var mapper = config.CreateMapper();
       // var mapper = new Mapper(config);
        UserDto dto = new UserDto
        {
            Name = "Niko",
            PassWord = "1234",
        };
        User user = mapper.Map<User>(dto);
        //User user = Mapper.Map<User>(dto);
        user.Name.ShouldBe("Niko");
        user.PassWord.ShouldBe("1234");
        user.Id.ToString().ShouldBe("0");
    }

這裡使用到 Shouldly 斷言框架,具體用法參考官方文檔。

寫完規則之後 通常會調用 AssertConfigurationIsValid 方法,檢查規則是否完整

        Mapper.AssertConfigurationIsValid();

兩種方法,單元測試均通過。這樣的話,藉助 Automapper 處理複雜的對象映射,將大大簡化我們的代碼量。

為了更加便捷地使用 AutoMappper ,對AutoMapper進行擴展

 public static class AutoMapperExtension
{
    /// <summary>
    /// 對象到對象
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <returns></returns>

    public static T MapTo<T>(this object obj)
    {
        if (obj == null) return default(T);
        Mapper.Initialize(ctx=>ctx.CreateMap(obj.GetType(),typeof(T)));
        return Mapper.Map<T>(obj);
    }

    /// <summary>
    /// 集合到集合
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="obj"></param>
    /// <returns></returns>

    public static List<T> MapTo<T>(this IEnumerable obj )
    {
        if (obj == null) throw new ArgumentNullException();
        Mapper.Initialize(ctx => ctx.CreateMap ( obj.GetType(), typeof(T))) ;
        return Mapper.Map<List<T>>(obj);
    }
}

使用上面的方法進行單元測試:

    public void testme()
    {
        UserDto dto = new UserDto
        {
            Name = "Niko",
            PassWord = "1234",
        };
        User user=dto.MapTo<User>();
        user.Name.ShouldBe("Niko");
        user.PassWord.ShouldBe("1234");
        user.Id.ToString().ShouldBe("0");
    }

測試通過,對比以上封裝前後的方法,發現封裝後代碼量更加簡潔,使用起來更加方便。


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

-Advertisement-
Play Games
更多相關文章
  • ...
  • 轉載需註明來源:http://www.cnblogs.com/yczcc/p/7594322.html openssl官網:https://www.openssl.org 下載源碼 源碼地址為:https://www.openssl.org/source/old/;當前最新版本為 1.1.0f,ht ...
  • 創建LVM分區: 相關命令: pvcreat /dev/sdb{1,2,3} 創建物理捲 vgcreat test_vg1 /dev/sdb1 創建捲組 vgcreat test_vg2 -s 16M /dev/sdb2 /dev/sdb3 指定PE大小為16M lvcreat 在已存在的捲組中創建 ...
  • 自己挖了一個大坑,,,然後苦逼的在碼代碼重寫樣式! 廢物不多少 直接上代碼 先在前臺創建一個TextBox,然後各種附加的屬性加上去:如圖所示 效果圖: 樣式代碼: 本文原創出處:http://www.cnblogs.com/PettyHandSome/ 歡迎各位轉載,但是未經作者本人同意,轉載文章 ...
  • 1. foreach C#編譯器會把foreach語句轉換為IEnumerable介面的方法和屬性。 foreach語句會解析為下麵的代碼段。 調用GetEnumerator()方法,獲得數組的一個枚舉 在while迴圈中,只要MoveNext()返回true,就一直迴圈下去 用Current屬性訪 ...
  • 用socket做了個程式,本地測試沒有問題,發佈到伺服器上時連接不上,用telnet測試連接失敗 伺服器上netstat -a 查看埠情況,127.0.0.1綁定埠9300處於監聽狀態,如下圖: 修改socket綁定IP為伺服器IP,埠狀態變為下圖: telnet連接測試成功! 很納悶,查了下 ...
  • 問題的產生的背景 由於我們使用了jenkins進行部署(jenkins~集群分發功能和職責處理),而對於.net core項目來說又是跨平臺的,所以對它的項目拉取,包的還原,項目的編譯和項目的發佈都是在一臺linux的jenkins節點上進行的,而我們開發時是在windows系統,所以在進行還原和編 ...
  • Tips 原文作者:Thomas Anderson, Blinkist 原文地址:Steve Jobs was successful because he mastered 'deep work' — here's how you can, too 你喝過麥卡倫姆威士忌嗎?如果你有這樣的經歷,你一定 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...