国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

AutoMapper(一)

2019-11-14 13:50:13
字體:
供稿:網(wǎng)友

返回總目錄


映射前后操作

偶爾有時(shí)候,在映射發(fā)生之前或之后,你可能需要執(zhí)行一些自定義的邏輯。這可能是很少見的事情,因?yàn)樵贏utoMapper之外處理這些事情是更明顯的。你可以創(chuàng)建一個(gè)映射前后的全局操作:

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

或者在映射期間,創(chuàng)建映射前后的回調(diào)函數(shù):

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

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

條件映射

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

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

namespace FrontAutoMapper{    class PRogram    {        static void Main(string[] args)        {//創(chuàng)建映射,映射條件是源類型的Age屬性在區(qū)間(0,149)范圍內(nèi)            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默認(rèn)值22            Console.WriteLine(p2.Age);//映射不成功,返回Person.Age默認(rèn)值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屬性默認(rèn)值是22    }    public class Aliens    {        public Aliens()        {            Age = -23;        }        public int Age { get; set; }//Aliens的Age屬性默認(rèn)值是-23    }}

這個(gè)例子是將年齡Age在區(qū)間(0,149)范圍內(nèi)的外星人映射成人,執(zhí)行結(jié)果如下,和預(yù)測結(jié)果一致。

image

配置

初始化

初始化是配置AutoMapper受人歡迎的模式,每個(gè)應(yīng)用域應(yīng)該配置一次:

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

映射配置是靜態(tài)的,此后不應(yīng)該改變了。

Profile實(shí)例

可用來組織AutoMapper配置

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

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

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

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

命名慣例

可以設(shè)置源和目標(biāo)的命名慣例。

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

也可以在配置文件中的Configure方法中設(shè)置:

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

小試牛刀:

在Aliens類中添加如下代碼:

public string MyName { set; get; }

在Person類中添加如下代碼:

public string my_name { get; set; }

結(jié)果如下,和預(yù)測結(jié)果一致:

image

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

替換字符

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

配置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; }

結(jié)果如下,和預(yù)測結(jié)果一致:

image

識(shí)別前綴/后綴

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

小試牛刀:

在Aliens類中添加如下代碼:

public string PGender { get; set; }

在Person類中添加如下代碼:

public string Gender { get; set; }

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

cfg.RecognizePrefixes("P");

結(jié)果如下,和預(yù)測結(jié)果一致:

image

默認(rèn)情況下,AutoMapper識(shí)別前綴“Get”,如果你需要清除前綴:

cfg.ClearPrefixes();

全局屬性/字段過濾

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

//不映射任何字段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

結(jié)果和預(yù)測一樣:

image

解釋一下:

我們?cè)谂渲弥刑砑恿诉^濾器,只允許getter是private的屬性映射,而Person的Age屬性getter默認(rèn)是public的,所以沒有將我們給的值44映射到,因而返回默認(rèn)的22,而Person的Code屬性的getter是私有的,所以映射到了,但是要想取到映射后的值,我們只能通過公有的字段來獲得。

配置可見性

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

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

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 霸州市| 仁布县| 金平| 马边| 朝阳县| 邵武市| 宿松县| 东乌珠穆沁旗| 新宁县| 崇义县| 锦州市| 凤山市| 个旧市| 兖州市| 闻喜县| 崇左市| 精河县| 池州市| 唐河县| 漳平市| 商都县| 武乡县| 牟定县| 湘乡市| 齐河县| 手机| 兴义市| 青阳县| 延安市| 恩平市| 长子县| 鲁山县| 图片| 射阳县| 德保县| 喀喇| 泾川县| 谢通门县| 富平县| 万宁市| 泽州县|