亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

詳解c# AutoMapper 使用方式

2019-10-29 21:08:07
字體:
來源:轉載
供稿:網友

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

先說說DTO

DTO是個什么東東?

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

為什么要用DTO?

1、DTO更注重數據,對領域對象進行合理封裝,從而不會將領域對象的行為過分暴露給表現層

2、DTO是面向UI的需求而設計的,而領域模型是面向業務而設計的。因此DTO更適合于和表現層的交互,通過DTO我們實現了表現層與領域Model之間的解耦,因此改動領域Model不會影響UI層

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

我從網上找了一些資料,

AutoMapper

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

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

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

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

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

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

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

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

  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(要轉化成為你想要的模型):

  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>    /// 類型映射,默認字段名字一一對應    /// </summary>    /// <typeparam name="TDestination">轉化之后的model,可以理解為viewmodel</typeparam>    /// <typeparam name="TSource">要被轉化的實體,Entity</typeparam>    /// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param>    /// <returns>轉化之后的實體</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>();

運行結果:

c#,AutoMapper,使用

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

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

        var config2 = new MapperConfiguration(          cfg => cfg.CreateMap<SourceUser, DestUser2>()            .ForMember(d => d.DestName, opt => opt.MapFrom(s => s.Name))  //指定字段一一對應            .ForMember(d => d.Birthday, opt => opt.MapFrom(src => src.Birthday.ToString("yy-MM-dd HH:mm")))//指定字段,并轉化指定的格式            .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轉化的擴展方法代碼貼上:

    /// <summary>    /// 集合列表類型映射,默認字段名字一一對應    /// </summary>    /// <typeparam name="TDestination">轉化之后的model,可以理解為viewmodel</typeparam>    /// <typeparam name="TSource">要被轉化的實體,Entity</typeparam>    /// <param name="source">可以使用這個擴展方法的類型,任何引用類型</param>    /// <returns>轉化之后的實體列表</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>();

運行結果:

#3207366255ee88021cc4b2901ae832bc#

 以上就是我個人所得,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到c#教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美激情视频一区二区| 午夜精品久久久久久久久久久久| 日韩一区二区三区在线播放| 91网站免费观看| 久久久久久久久电影| 韩剧1988在线观看免费完整版| 久久人人爽人人爽人人片av高请| 亚洲国产91精品在线观看| 亚洲精品白浆高清久久久久久| 国产精品白嫩初高中害羞小美女| 亚洲第一二三四五区| 欧洲永久精品大片ww免费漫画| www.99久久热国产日韩欧美.com| 亚洲日本中文字幕免费在线不卡| 日本电影亚洲天堂| 亚洲高清不卡av| 亚洲女人天堂视频| 国产精品无码专区在线观看| 国语自产精品视频在线看| 欧美最近摘花xxxx摘花| 九九视频直播综合网| 91久久久久久久| 亚洲色图综合网| 日本成人激情视频| 色爱精品视频一区| 在线丨暗呦小u女国产精品| 日韩av综合中文字幕| 亚洲高清av在线| 亚洲精品久久久久久久久久久久| 欧美视频一二三| 欧美激情中文字幕乱码免费| 日韩精品在线观看一区| 97免费中文视频在线观看| 亚洲国产美女久久久久| 欧美一区二区三区图| 欧美性少妇18aaaa视频| 91香蕉嫩草神马影院在线观看| 美女啪啪无遮挡免费久久网站| 青青久久av北条麻妃海外网| 日韩视频免费在线观看| 亚洲欧美国产va在线影院| 欧美成人免费播放| 国产精品wwwwww| 91地址最新发布| 日本中文字幕不卡免费| 国产一区深夜福利| 亚洲人成欧美中文字幕| 亚洲va欧美va在线观看| 欧美午夜女人视频在线| 91av视频在线播放| 国产欧美在线视频| 亚洲高清福利视频| 成人黄色激情网| 精品国产欧美一区二区五十路| 亚洲经典中文字幕| 日韩男女性生活视频| 欧美国产极速在线| 色吧影院999| 亚洲精品自产拍| 欧美理论片在线观看| 国产精品福利无圣光在线一区| 亚洲高清一二三区| 欧美超级免费视 在线| 欧美乱人伦中文字幕在线| 91国在线精品国内播放| 狠狠躁18三区二区一区| 国产亚洲精品久久久久久牛牛| 成人国产在线视频| 日韩av电影中文字幕| 国产一区二区三区丝袜| 久久99精品视频一区97| 日韩欧美国产一区二区| 日本最新高清不卡中文字幕| 成人精品视频99在线观看免费| 国产中文字幕91| 欧美一级淫片丝袜脚交| 91av国产在线| 国产91对白在线播放| 国产精品自拍偷拍视频| 欧美极品少妇xxxxⅹ裸体艺术| 成人国产精品久久久久久亚洲| 久久久国产一区| 亚洲欧美在线一区| 日韩av中文字幕在线| 亚洲网站在线观看| 91成人在线观看国产| 欧美最猛黑人xxxx黑人猛叫黄| 国产在线久久久| 欧美乱人伦中文字幕在线| 欧美精品18videos性欧美| 亚洲欧美精品在线| 国产精品91一区| 亚洲国产中文字幕在线观看| 国产成一区二区| 理论片在线不卡免费观看| 成人激情电影一区二区| 欧美色欧美亚洲高清在线视频| 成人黄色网免费| 成人免费自拍视频| 成人在线观看视频网站| 亚洲国产天堂网精品网站| 九九热最新视频//这里只有精品| 亚洲一区二区三区视频| 国产精品成人观看视频国产奇米| 欧美在线视频免费播放| www国产精品com| 亚洲视频电影图片偷拍一区| 日韩精品福利在线| 91亚洲人电影| 国产视频精品久久久| 久久久久久久久中文字幕| 亚洲一区www| 国产精品一区二区三区免费视频| 国产色视频一区| 亚洲福利精品在线| 欧美色欧美亚洲高清在线视频| 日韩成人av一区| 91精品久久久久久久久不口人| 亚洲视频axxx| 8050国产精品久久久久久| 欧美日韩成人免费| 国产日韩欧美中文在线播放| 久久久久久久久久久亚洲| 亚洲男人天堂古典| 久久久欧美一区二区| 久久亚洲国产精品| 人人澡人人澡人人看欧美| 91免费福利视频| 久久91精品国产91久久久| 日韩精品在线免费播放| 热门国产精品亚洲第一区在线| 精品人伦一区二区三区蜜桃免费| 日韩精品视频免费| 在线视频中文亚洲| 91精品久久久久久久久中文字幕| 在线观看国产精品日韩av| 在线视频欧美日韩| 中文字幕国内精品| 精品露脸国产偷人在视频| 日韩亚洲在线观看| 成人中文字幕+乱码+中文字幕| 亚洲精品美女免费| 91精品久久久久久久久久久久久久| 91高清视频在线免费观看| 2019中文字幕在线免费观看| 国外日韩电影在线观看| 91精品国产91久久久| 久久露脸国产精品| 亚洲人午夜精品| 亚洲性视频网站| 日本国产欧美一区二区三区| 国内精品小视频在线观看| 96sao精品视频在线观看| 91久久久久久久久久| 亚洲欧洲国产精品| 久久久久国产精品免费网站| 欧美国产日韩一区二区三区| 亚洲人在线视频| 国产视频丨精品|在线观看| 欧美在线视频a| 精品国产乱码久久久久久虫虫漫画| 亚洲aⅴ男人的天堂在线观看| 成人黄色免费网站在线观看| 日韩在线观看网站|