最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解c# AutoMapper 使用方式

 更新時間:2017年12月04日 11:35:31   作者:大穩(wěn)·楊  
本篇文章主要介紹了詳解c# AutoMapper 使用方式 ,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

安裝方式:使用vs自帶的nuget管理工具,搜索AutoMapper ,選擇第一個安裝到你的項目即可。

先說說DTO

DTO是個什么東東?

DTO(Data Transfer Object)就是數(shù)據(jù)傳輸對象,說白了就是一個對象,只不過里邊全是數(shù)據(jù)而已。

為什么要用DTO?

1、DTO更注重數(shù)據(jù),對領(lǐng)域?qū)ο筮M行合理封裝,從而不會將領(lǐng)域?qū)ο蟮男袨檫^分暴露給表現(xiàn)層

2、DTO是面向UI的需求而設(shè)計的,而領(lǐng)域模型是面向業(yè)務(wù)而設(shè)計的。因此DTO更適合于和表現(xiàn)層的交互,通過DTO我們實現(xiàn)了表現(xiàn)層與領(lǐng)域Model之間的解耦,因此改動領(lǐng)域Model不會影響UI層

3、DTO說白了就是數(shù)據(jù)而已,不包含任何的業(yè)務(wù)邏輯,屬于瘦身型的對象,使用時可以根據(jù)不同的UI需求進行靈活的運用

我從網(wǎng)上找了一些資料,

AutoMapper

現(xiàn)在我們既然知道了使用DTO的好處,那么我們肯定也想馬上使用它,但是這里會牽扯一個問題:怎樣實現(xiàn)DTO和領(lǐng)域Model之間的轉(zhuǎn)換?

有兩個思路,我們要么自己寫轉(zhuǎn)換代碼,要么使用工具。不過就應(yīng)用而言,我還是覺得用工具比較簡單快捷,那就使用工具吧。其實這樣的轉(zhuǎn)換工具很多,不過我還是決定使用AutoMapper,因為它足夠輕量級,而且也非常流行,國外的大牛們都使用它。使用AutoMapper可以很方便的實現(xiàn)DTO和領(lǐng)域Model之間的轉(zhuǎn)換,它是一個強大的Object-Object Mapping工具。

下載了個demo,然后自己又寫了一遍,我把AutoMapper 的使用分為兩種:

1、viewmodel與實體的字段名字是一致的,viewmodel的字段可以比實體中的字段少,但是不能多。

還有一種情況是:源實體中的字段名字是Getxxx,那么viewmodel中對應(yīng)的字段可以是xxx,也會自動對應(yīng)賦值,比如我寫的demo中源實體中GetA,viewmodel中的A;

再有一種情況就是實體中的實體賦值,在我寫的這個例子中,源實體中包含的實體類字段為Sub,里面包含的字段名字為Age,

那么destmodel中對應(yīng)的字段名字可以是:SubAge,那么automapper就可以自動為你賦值了,大家看最后的運行結(jié)果。

給大家看下我建的源實體:

  public class Source1
  {
    public string Name { set; get; }

    public string GetA { set; get; }
    public string GetD { set; get; }


    public string SetB { set; get; }

    public string c { set; get; }

    public SubSource1 Sub { set; get; }
  }


  public class SubSource1
  {
    public string Age { set; get; }

  }

還有viewmodel(要轉(zhuǎn)化成為你想要的模型):

  public class Dest1
  {
    public string Name { set; get; }

    public string A { set; get; }

    public string C { set; get; }

    public string SubAge { set; get; }

    public string D { set; get; }
  }

我封裝的擴展方法:

    /// <summary>
    /// 類型映射,默認字段名字一一對應(yīng)
    /// </summary>
    /// <typeparam name="TDestination">轉(zhuǎn)化之后的model,可以理解為viewmodel</typeparam>
    /// <typeparam name="TSource">要被轉(zhuǎn)化的實體,Entity</typeparam>
    /// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param>
    /// <returns>轉(zhuǎn)化之后的實體</returns>
    public static TDestination MapTo<TDestination, TSource>(this TSource source) 
      where TDestination:class 
      where TSource :class 
    {
      if (source == null) return default(TDestination);
      var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, TSource>());
      var mapper = config.CreateMapper();
      return mapper.Map<TDestination>(source);
    }

使用方式:

        var source1 = new Source1
        {
          Name = "source",
          Sub = new SubSource1 { Age = "25" },
          c = "c",
          GetA = "A",
          SetB = "B"
        };

        var destViewModel = source1.MapTo<Dest1, Source1>();

運行結(jié)果:

 

2.viewmodel與實體字段名字沒有全部對應(yīng),只有幾個字段的名字和源實體中的字段名字是一樣的,其他的字段是通過實體中的幾個字段組合或者是格式或者是類型轉(zhuǎn)化而來的,

使用方法:不能再使用這個擴展方法了,只能自己額外寫代碼,代碼如下:

        var config2 = new MapperConfiguration(
          cfg => cfg.CreateMap<SourceUser, DestUser2>()
            .ForMember(d => d.DestName, opt => opt.MapFrom(s => s.Name))  //指定字段一一對應(yīng)
            .ForMember(d => d.Birthday, opt => opt.MapFrom(src => src.Birthday.ToString("yy-MM-dd HH:mm")))//指定字段,并轉(zhuǎn)化指定的格式
            .ForMember(d => d.Age, opt => opt.Condition(src => src.Age > 5))//條件賦值
            .ForMember(d => d.A1, opt => opt.Ignore())//忽略該字段,不給該字段賦值
            .ForMember(d => d.A1, opt => opt.NullSubstitute("Default Value"))//如果源字段值為空,則賦值為 Default Value
            .ForMember(d => d.A1, opt => opt.MapFrom(src => src.Name + src.Age * 3 + src.Birthday.ToString("d"))));//可以自己隨意組合賦值
        var mapper2 = config2.CreateMapper();

注釋中都包含了平時常用的幾種情況,其他的我就沒有再寫。

下面再給大家把list轉(zhuǎn)化的擴展方法代碼貼上:

    /// <summary>
    /// 集合列表類型映射,默認字段名字一一對應(yīng)
    /// </summary>
    /// <typeparam name="TDestination">轉(zhuǎn)化之后的model,可以理解為viewmodel</typeparam>
    /// <typeparam name="TSource">要被轉(zhuǎn)化的實體,Entity</typeparam>
    /// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param>
    /// <returns>轉(zhuǎn)化之后的實體列表</returns>
    public static IEnumerable<TDestination> MapToList<TDestination, TSource>(this IEnumerable<TSource> source)
      where TDestination : class
      where TSource : class
    {
      if (source == null) return new List<TDestination>();
      var config = new MapperConfiguration(cfg => cfg.CreateMap<TDestination, TSource>());
      var mapper = config.CreateMapper();
      return mapper.Map<List<TDestination>>(source);
    }

同樣的使用方式:

        var source1 = new Source1
        {
          Name = "source",
          Sub = new SubSource1 { Age = "25" },
          c = "c",
          GetA = "A",
          SetB = "B"
        };
var source3 = new Source1
        {
          Name = "source3",
          Sub = new SubSource1 { Age = "253" },
          c = "c3",
          GetA = "A3",
          SetB = "B3"
        };
        var sourceList = new List<Source1> { source1, source3 };
        var destViewModelList = sourceList.MapToList<Dest1, Source1>();

運行結(jié)果:

 以上就是我個人所得,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C# 通過 oledb 操作Excel實例代碼

    C# 通過 oledb 操作Excel實例代碼

    本篇文章主要介紹了C# 通過 oledb 操作Excel實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 淺談C#索引器

    淺談C#索引器

    這篇文章主要簡單介紹C#索引器,索引器使你可從語法上方便地創(chuàng)建類、結(jié)構(gòu)或接口,以便客戶端應(yīng)用程序可以像訪問數(shù)組一樣訪問它們。編譯器將生成一個 Item 屬性和適當(dāng)?shù)脑L問器方法,在主要目標(biāo)是封裝內(nèi)部集合或數(shù)組的類型中,常常要實現(xiàn)索引器,下面我們一起來看看具體內(nèi)容吧
    2021-11-11
  • C#獲取關(guān)鍵字附近文字算法實例

    C#獲取關(guān)鍵字附近文字算法實例

    這篇文章主要介紹了C#獲取關(guān)鍵字附近文字算法,實例分析了文字查找算法的原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 一個可攜帶附加消息的增強消息框MessageBoxEx

    一個可攜帶附加消息的增強消息框MessageBoxEx

    一個可攜帶附加消息的增強消息框MessageBoxEx分享給大家,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • C#中winform使用相對路徑讀取文件的方法

    C#中winform使用相對路徑讀取文件的方法

    這篇文章主要介紹了C#中winform使用相對路徑讀取文件的方法,實例分析了C#使用相對路徑讀取文件的技巧與實際應(yīng)用,需要的朋友可以參考下
    2015-01-01
  • C#使用融合通信API發(fā)送手機短信功能

    C#使用融合通信API發(fā)送手機短信功能

    融合云通信服務(wù)平臺,為企業(yè)提供全方位通信服務(wù),發(fā)送手機短信是其一項核心功能,本文介紹了如何使用融合云通信服務(wù)平臺的API通過C#實現(xiàn)發(fā)送手機短信的功能,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • C#使用反射和LINQ查詢程序集的元數(shù)據(jù)

    C#使用反射和LINQ查詢程序集的元數(shù)據(jù)

    在?C#?中,反射是一個強大的工具,它允許我們在運行時檢查程序集、類型、方法等的元數(shù)據(jù),結(jié)合?LINQ,我們可以用更簡潔和表達力強的方式處理這些信息,本文將詳細講解如何使用反射與?LINQ?查詢程序集的元數(shù)據(jù),需要的朋友可以參考下
    2024-08-08
  • 詳解C# 虛方法virtual

    詳解C# 虛方法virtual

    這篇文章主要介紹了C# 虛方法virtual的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-04-04
  • C#ComboBox控件“設(shè)置 DataSource 屬性后無法修改項集合”的解決方法

    C#ComboBox控件“設(shè)置 DataSource 屬性后無法修改項集合”的解決方法

    這篇文章主要介紹了C#ComboBox控件“設(shè)置 DataSource 屬性后無法修改項集合”的解決方法 ,需要的朋友可以參考下
    2019-04-04
  • C#使用OpenCV剪切圖像中的圓形和矩形的示例代碼

    C#使用OpenCV剪切圖像中的圓形和矩形的示例代碼

    這篇文章主要介紹了C#使用OpenCV剪切圖像中的圓形和矩形,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

时尚| 前郭尔| 原平市| 定安县| 平乡县| 南通市| 乌拉特后旗| 蒲江县| 嘉兴市| 荆州市| 建瓯市| 常山县| 祁门县| 板桥市| 襄樊市| 崇仁县| 蓝田县| 连城县| 石狮市| 财经| 灵璧县| 长丰县| 惠安县| 灵丘县| 浪卡子县| 师宗县| 改则县| 盖州市| 丰县| 镇康县| 阳山县| 项城市| 大足县| 敦化市| 通江县| 固原市| 新绛县| 江山市| 偃师市| 肥乡县| 芒康县|