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

首頁 > 學院 > 開發設計 > 正文

AutoMapper(一)

2019-11-14 13:50:13
字體:
來源:轉載
供稿:網友

返回總目錄


映射前后操作

偶爾有時候,在映射發生之前或之后,你可能需要執行一些自定義的邏輯。這可能是很少見的事情,因為在AutoMapper之外處理這些事情是更明顯的。你可以創建一個映射前后的全局操作:

Mapper.CreateMap<Source, Dest>()    .BeforeMap((src, dest) => src.Value = src.Value + 10)    .AfterMap((src, dest) => dest.Name = "John");

或者在映射期間,創建映射前后的回調函數:

int i = 10;Mapper.Map<Source, Dest>(src, opt => {    opt.BeforeMap((src, dest) => src.Value = src.Value + i);    opt.AfterMap((src, dest) => dest.Name = HttpContext.Current.Identity.Name);});

當你需要將上下文信息注入映射前后的行為中時,后者的配置很有用。

條件映射

在屬性映射之前,AutoMapper允許將必須滿足的條件添加到屬性上。

這個用在下面這種情況,比如有兩個類,分別是Aliens(外星人)和Person(人)類,都有一個Age屬性,我們都知道我們人類的年齡都是非負數,所以我們這里用unsigned int(無符號整數)類型。但是,目前人類科技水平有限,還沒有研究出是否有外星人存在,就更無法確定其年齡屬性了,所以我們這里假設外星人的年齡可以為負數(如果你反駁我你也沒依據啊,暫且就這樣吧),那么就定義其為int類型,如果我們要將外星人映射到人類上,其實就是uint到int之間的映射:

namespace FrontAutoMapper{    class PRogram    {        static void Main(string[] args)        {//創建映射,映射條件是源類型的Age屬性在區間(0,149)范圍內            Mapper.CreateMap<Aliens, Person>().ForMember(dest => dest.Age, opt => opt.Condition(src => src.Age > 0 && src.Age < 149));            var p1 = Mapper.Map<Person>(new Aliens() { Age = -1 });//不符合映射條件              var p2 = Mapper.Map<Person>(new Aliens() { Age = 0 });//不符合映射條件              var p3 = Mapper.Map<Person>(new Aliens() { Age = 1 });//符合映射條件              var p4 = Mapper.Map<Person>(new Aliens() { Age = 148 });//符合映射條件              var p5 = Mapper.Map<Person>(new Aliens() { Age = 149 });//不符合映射條件              Console.WriteLine(p1.Age);//映射不成功,返回Person.Age默認值22            Console.WriteLine(p2.Age);//映射不成功,返回Person.Age默認值22            Console.WriteLine(p3.Age);//映射成功,返回新值1            Console.WriteLine(p4.Age);//映射成功,返回新值148            Console.WriteLine(p5.Age);//映射不成功,返回新值22            Console.Read();        }    }    public class Person    {        public Person()        {            Age = 22;        }        public uint Age { set; get; }//Person的Age屬性默認值是22    }    public class Aliens    {        public Aliens()        {            Age = -23;        }        public int Age { get; set; }//Aliens的Age屬性默認值是-23    }}

這個例子是將年齡Age在區間(0,149)范圍內的外星人映射成人,執行結果如下,和預測結果一致。

image

配置

初始化

初始化是配置AutoMapper受人歡迎的模式,每個應用域應該配置一次:

//初始化配置文件Mapper.Initialize(cfg =>{    cfg.CreateMap<Aliens, Person>();    cfg.AddProfile<AliensPersonProfile>();//添加一個配置文件});

映射配置是靜態的,此后不應該改變了。

Profile實例

可用來組織AutoMapper配置

namespace ConditionalMapping{    public class AliensPersonProfile : Profile    {        protected override void Configure()        {            //放一些CreateMap(...)等映射配置操作        }    }}

自定義一個繼承了Profile類的類,然后重寫Configure方法,在該方法中放一些映射的配置。

像下面這樣初始化自定義的配置文件:

//初始化配置文件Mapper.Initialize(cfg =>{    cfg.AddProfile<AliensPersonProfile>();//添加一個配置文件});

命名慣例

可以設置源和目標的命名慣例。

//初始化配置文件Mapper.Initialize(cfg =>{    cfg.SourceMemberNamingConvention=new LowerUnderscoreNamingConvention();    cfg.DestinationMemberNamingConvention=new PascalCaseNamingConvention();});

也可以在配置文件中的Configure方法中設置:

protected override void Configure(){    SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();    DestinationMemberNamingConvention = new PascalCaseNamingConvention();}

小試牛刀:

在Aliens類中添加如下代碼:

public string MyName { set; get; }

在Person類中添加如下代碼:

public string my_name { get; set; }

結果如下,和預測結果一致:

image

可見,這種映射配置就是告訴AutoMapper這兩種命名慣例可以相互映射。而且需要注意的是,這兩句代碼可放在CreateMap()方法之后。

替換字符

在成員名字映射期間,也可以替換個別的字符或者整個單詞。

配置Mapper(可在Initialize方法或配置文件中均可,后面不再提示),注意一定要在CreateMap方法之前,配置替換字符,否則沒有效果。這也符合邏輯,只有先添加替換條件,才能按條件映射嘛。

cfg.ReplaceMemberName("Ä", "A");cfg.ReplaceMemberName("í", "i");cfg.ReplaceMemberName("Tool", "Car");cfg.AddProfile<AliensPersonProfile>();

小試牛刀:

在Aliens類中添加如下代碼:

public int Ävíator { get; set; }public string ToolName { get; set; }

在Person類中添加如下代碼:

public int Aviator { get; set; }public string CarName { get; set; }

結果如下,和預測結果一致:

image

識別前綴/后綴

有時候你的源類型和目標類型的屬性有公共的前綴/后綴,由于這些命名不匹配的緣故,使你不得不處理這些自定義的成員映射。為了實現這個,可以識別前后綴:

小試牛刀:

在Aliens類中添加如下代碼:

public string PGender { get; set; }

在Person類中添加如下代碼:

public string Gender { get; set; }

可見,源類型中有一個前綴為“P”的字段PGender,要想成功映射為Person,就必須識別出前綴“P”,所以在Mapper的配置中添加代碼(注意,添加到CreateMap方法之前,否則無效):

cfg.RecognizePrefixes("P");

結果如下,和預測結果一致:

image

默認情況下,AutoMapper識別前綴“Get”,如果你需要清除前綴:

cfg.ClearPrefixes();

全局屬性/字段過濾

默認情況下,AutoMapper映射每一個公共的屬性/字段。你可以使用屬性/字段過濾器過濾出不需要映射的屬性/字段:

//不映射任何字段cfg.ShouldMapField = fi => false;//只映射getter是private的屬性cfg.ShouldMapProperty = pi => pi.GetMethod != null && pi.GetMethod.IsPrivate;cfg.AddProfile<AliensPersonProfile>();

小試牛刀:

分別給Aliens和Person類添加下面這段代碼:

private string code;public string Code{    private get { return code; }    set { code = value; }}

Main方法中添加代碼:

var p10 = Mapper.Map<Person>(new Aliens() { Age = 44,Code = "111"});Console.WriteLine(string.Format("Person.Age={0},Person.code={1}",p10.Age,p10.code));//22,111

結果和預測一樣:

image

解釋一下:

我們在配置中添加了過濾器,只允許getter是private的屬性映射,而Person的Age屬性getter默認是public的,所以沒有將我們給的值44映射到,因而返回默認的22,而Person的Code屬性的getter是私有的,所以映射到了,但是要想取到映射后的值,我們只能通過公有的字段來獲得。

配置可見性

默認情況下,AutoMapper只識別公有成員。雖然可以映射到私有的setter,但是如果整個屬性是private/internal的,那么就會跳過internal/private的方法和屬性。為了命令AutoMapper識別具有其他可見性的成員,重寫默認的過濾器ShouldMapField或ShouldMapProperty:

Mapper.Initialize(cfg =>{    // 映射具有public或internal的getter的屬性    cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;    cfg.CreateMap<Source, Destination>();});

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
55夜色66夜色国产精品视频| 成人美女av在线直播| 国产精品999999| 精品爽片免费看久久| 欧美成人精品不卡视频在线观看| 伊人久久五月天| 欧美视频不卡中文| 午夜精品久久久99热福利| 国产精品盗摄久久久| 亚洲黄一区二区| 国产精品永久免费视频| 日韩欧美在线视频免费观看| 亚洲电影免费观看高清完整版| 日韩最新免费不卡| 精品性高朝久久久久久久| 亚洲片在线资源| 亚洲免费视频在线观看| 97超级碰在线看视频免费在线看| 日韩精品日韩在线观看| 亚洲大胆人体av| 亚洲高清色综合| 欧美国产乱视频| 国产亚洲综合久久| 亚洲国产精品电影在线观看| 亚洲欧美中文日韩v在线观看| 97精品欧美一区二区三区| 日本精品久久久| 国产日韩在线亚洲字幕中文| 成人性教育视频在线观看| 成人综合国产精品| 国产欧美日韩精品专区| 亚洲福利视频久久| 68精品久久久久久欧美| 成人黄色网免费| 亚洲成色www8888| 欧美高清理论片| 精品中文视频在线| 国产精品jizz在线观看麻豆| 久青草国产97香蕉在线视频| 亚洲国产精品久久久久| 2020国产精品视频| 国产精品久久久久国产a级| 2019精品视频| 亚洲福利视频在线| 亚洲999一在线观看www| 成人黄色av播放免费| 成人www视频在线观看| 欧美激情第99页| 久久久久99精品久久久久| 亚洲天堂第一页| 国产成人精品国内自产拍免费看| 国产精品久久久久久中文字| 免费91在线视频| 欧美极品少妇xxxxx| 国产精品久久97| 欧美极品第一页| 亚洲乱码av中文一区二区| 精品亚洲aⅴ在线观看| 亚洲精品美女久久久| 97超碰国产精品女人人人爽| 久久综合伊人77777| 精品久久久久久久久久ntr影视| 欧美午夜xxx| 中文字幕av一区中文字幕天堂| 日韩av在线资源| 色偷偷综合社区| 国产一区二区三区视频| 日韩精品在线播放| 日韩动漫免费观看电视剧高清| 久久久久免费精品国产| 欧美日韩中文字幕日韩欧美| 国产自摸综合网| 在线精品播放av| 久久久久久久成人| 日韩不卡在线观看| 日本欧美中文字幕| 久久久亚洲国产| 国模视频一区二区三区| 成人精品在线视频| 日韩电影免费在线观看中文字幕| 成人在线小视频| 国产亚洲精品美女久久久久| 国内精品久久久久久| 日韩hd视频在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 成人午夜高潮视频| 亚洲自拍偷拍第一页| 91精品视频在线播放| 欧美日韩一区免费| 日韩精品一二三四区| 精品国产91乱高清在线观看| 懂色aⅴ精品一区二区三区蜜月| 亚洲国产精品久久久久秋霞蜜臀| 色爱精品视频一区| 久久久精品一区二区三区| 亚洲欧美色图片| 国产精品一区二区久久国产| 日韩中文字幕免费| 久久久综合av| 亚洲国产精品久久91精品| 久久影院在线观看| 91精品美女在线| 亚洲在线www| 国产精品久久av| 欧美国产日产韩国视频| 视频在线观看一区二区| 欧美激情在线狂野欧美精品| 精品久久久久久久久久久久久久| 曰本色欧美视频在线| 久久精品国产精品亚洲| 亚洲人成五月天| 色综合色综合久久综合频道88| 97免费视频在线播放| 欧美性xxxxx极品娇小| 久久综合伊人77777尤物| 日韩精品在线观看一区二区| 国产精品美女免费看| 亚洲区bt下载| 亚洲bt欧美bt日本bt| 国产精品情侣自拍| 8050国产精品久久久久久| 国产精品高潮粉嫩av| 国产精品亚洲美女av网站| 国语自产精品视频在线看抢先版图片| 在线日韩日本国产亚洲| 欧美—级a级欧美特级ar全黄| 永久555www成人免费| 亚洲欧洲免费视频| 97香蕉久久超级碰碰高清版| 日韩a**中文字幕| 国产亚洲精品激情久久| 久久久久久久久久亚洲| 中文字幕久精品免费视频| 欧美日在线观看| 一区二区三区www| 在线视频欧美日韩精品| 久久av中文字幕| 综合激情国产一区| 91影视免费在线观看| 欧美激情精品久久久| 欧美精品中文字幕一区| 91高潮精品免费porn| 国产精品视频免费在线观看| 成人a视频在线观看| 欧美寡妇偷汉性猛交| www.午夜精品| 亚洲一区亚洲二区| 欧美日韩国产中文精品字幕自在自线| 国产在线精品播放| 黑人狂躁日本妞一区二区三区| 亚洲第一精品久久忘忧草社区| 日韩精品久久久久久久玫瑰园| 精品国产欧美一区二区三区成人| 久久精品国产亚洲一区二区| 亚洲精品成人久久电影| 亚洲午夜av久久乱码| 欧美日韩在线观看视频| 亚洲91精品在线观看| 欧美性少妇18aaaa视频| 91人人爽人人爽人人精88v| 亚洲精品日韩激情在线电影| 久久久久久久久久久亚洲| 欧美色道久久88综合亚洲精品| 成人午夜激情免费视频|