来自  资质荣誉 2019-09-23 19:29 的文章
当前位置: 澳门太阳娱乐手机登录 > 资质荣誉 > 正文

AutoMapper总结

AutoMapper是一个对象和对象间的映射器。对象与对象的投射是因此转移一种等级次序的输入对象为一种不一致品种的输出对象工作的。让AutoMapper风趣的地点在于它提供了一部分将项目A映射到类型B这种低级庸俗的工作的风趣惯例。只要类型B服从AutoMapper已经确立的惯例,大比很多状态下,映射两类别型零配置就足以了。  首先,需求有source和destination类型。暗许景况下AutoMapper 只要Destination类型的积极分子名字与Source类型的积极分子名字相称(成员名称不区分轻重缓急写),并且成员类型同样就直接会将值传递给Destination类型。  AutoMapper只要做二遍初叶化就足以应用,因而最佳的陈设代码的地方应该在利用运行时。

开端化管理(Profile实例)

  Initialize():实例化Mapper对象  CreateMap():创制映射关系 Ex:Mapper.Initialize(cfg=>{ cfg.CreateMap<Source, Dest>;  AddProfile:使用布署文件创设映射关系 Ex: Mapper.Initialize(cfg=>{cfg.AddProfile<MyProfile>;对于MyProfile对象必要三番五次Profile对象,不分厚薄写 Configure()方法。

照耀前后操作:  

  BeforeMap(): 在炫丽前实践的管理。Ex:BeforeMap((src, dest) => src.Value = src.Value + 1)  AfterMap(): 在酷炫后实施的管理。 Ex:AfterMap((src, dest) => src.Name = "FengTest")

标准化映射

  ForMember():对于映射中成员的管理。  Condition():对于规范映射处理,满足该法则才会给指标成员赋值。  Ex:ForMember(dest => dest.Value, opt => opt.Condition(src => src.Value > 0 && src.Value < 130));

取名惯例

  SourceMemberNamingConvention :源类型成员命名准绳  Ex: cfg.SourceMemberNamingConvention = new LowerUnderscoreNamingConvention(); //下划线命名法  cfg.DestinationMemberNamingConvention :目的项目成员命名准则  Ex: cfg.DestinationMemberNamingConvention = new 帕斯CarlCaseNamingConvention(); //帕斯卡命名法

轮换字符

  ReplaceMemberName():将源成员名称中的字符替换来新的字符此方法必得在CreateMap在此之前  Ex: cfg.ReplaceMemberName("Tool", "Car");

前后缀

  RecognizePrefixes():识别源成员名称中的前缀字符 Ex: cfg.RecognizePrefixes;  RecognizePostfixes():识别源成员名称中的后缀字符 Ex: cfg.RecognizePostfixes;  此方法必得在CreateMap从前,并且私下认可是可辨“Get”字符前缀  ClearPrefixes(): 清除前缀 Ex:cfg.CliearPrefixes()

大局过虑

  ShouldMapField : 字段的照射条件 Ex: cfg.ShouldMapField = 田野同志 => false; //不映射任何字段  ShouldMapProperty:属性的投射条件  Ex:cfg.ShouldMapProperty = pro => pro.GetMethod != null && pro.GetMethod.IsPrivate;  此措施必需是源类型与目的项目都知足该法则才具映照管理,私下认可景况下AutoMapper只对集体成员做映射,假使想识别Private/internal,能够修改那四个属性值。

构造函数

  暗中同意景况下,当目的项目标构造函数中的参数名称、类型与源类型成员的名称、类型一样,AutoMapper会自动映射。  当构造函数的参数名称与指标成员的名号差异时,可选择ForCtorParam()方法内定。  ForCtorParam() : 对构造函数参数映射Ex:ForCtorParam("age1",user=>user.MapFrom(src=>src.Age))

原则对象映射器

  AddConditionalObjectMapper():符合条件后七个系列自动映射。  Ex:cfg.AddConditionalObjectMapper().Where => d.Name == s.Name + "Dto");

分子配置

  AddMemberConfiguration():配置文件, 配置中的东西都以以该措施最初的。  Ex:cfg.AddMemberConfiguration().AddMember<NameSplitMember>(); 暗许配置  AddName<ReplaceName>(r => r.AddReplace) 替换字符  AddName<PrePostfixName>(p => p.AddStrings(pr => pr.Prefixes, "Get", "get"))识别前缀  AddName<PrePostfixName>(p => p.AddStrings(pr => pr.Postfixes, "Set", "set"))识别后缀  AddName<SourceToDestinationNameMapperAttributesMember>() 性情扶助  [MapToAttribute] :脾性,匹配基于给定名称的属性  AutoMapper默许值:AddMemberConfiguration().AddMember<NameSplitMember>()  .AddName<PrePostfixName>(_ => _.AddStrings(p => p.Prefixes,"Get"))  .AddName<SourceToDestinationNameMapperAttributesMember>();  AddName和AddMember中的每种门类都是依照ISourceToDestinationNameMapper和IChildMemberConfiguration接口的。也得以成立和煦的类经过拉姆da语句参数来布署属性,因而你能够微调AutoMapper如何深入分析属性映射。

自定义类型转变 

  在作对象之间的转移时,有个别属性的档期的顺序是无法间接转变的,但经过证实,暗中认可能够将string类型映射为int和Date提姆e类型。  

方法一:

ConvertUsing() :使用映射的方式Ex: cfg.CreateMap<Source, Destination>().ConvertUsing(s =>{var d = new Destination();d.Value1 = System.Convert.ToInt32;d.Value2 = System.Convert.ToDateTime;d.Value3 = Type.GetType;return d;});

方法二:

定叁个类,该项目需求持续 ITypeConverter泛型接口,源类型和对象项目,而且达成Convert方法Ex: public class CustomTypeConverter : ITypeConverter<Source, Destination>然后在Mapper.Initialize的时候使用ConvertUsing的泛型方法Ex: cfg.CreateMap<Source, Destination>().ConvertUsing<CustomTypeConverter>();

方法三:

定三个类,该品种须求继续ITypeConverter泛型接口,源基础项目和指标基础项目,而且完结Convert方法Ex:public class TypeConverter : ITypeConverter<string, Type>然后在Mapper.Initialize的时候创设该基类型的炫目,该方式在Mapper全局都以行之有效的Ex: Mapper.Initialize(cfg => {cfg.CreateMap<string, Type>().ConvertUsing<TypeConverter>();cfg.CreateMap<Source, Destination>;

自定义值分析

  尽管AutoMapper覆盖了一点都不小片段对象成员的照耀场景,但照旧有一点内需自定义管理。因是对目的类的中的某六性情质的赋值处理,因些会用到ForMember()方法。使用ResolveUsing() :指定赋值的不二秘技。

方法一:

Ex:cfg.CreateMap<Source, Destination>().ForMember(dest => dest.Total, opt => {opt.ResolveUsing(s =>{var destination = new Destination();destination.Total = s.Value1 + s.Value2;return destination.Total;}); });

方法二:

始建四个类,并促成IValueResolver方法Ex: public class MyValueResolver : IValueResolver<Source, Destination, int>然后在开立映射关系的时候为其退换赋值格局Ex: cfg.CreateMap<Source, Destination>().ForMember(dest => dest.Total, opt => { opt.ResolveUsing<MyValueResolver>;

Dynamic和ExpandoObject映射

澳门太阳娱乐在线网址,Dynamic动态制造对象 Ex:dynamic dynamicObj = new ExpandoObject();//ExpandoObject对象饱含可在运维时动态拉长或移除的成员.纵然Dynamic为动态指标不有法子创建映射关系,但不能不先对Mapper实例化,才具利用。Ex: public static ExpandoObject DynamicAndExpandoObject(){Mapper.Initialize(cfg=> { });dynamic dynamicObj = new ExpandoObject();dynamicObj.Age = 12;dynamicObj.Name = "Feng测量试验";Person person = Mapper.Map<Person>(dynamicObj);Console.WriteLine("person.Age={0},Name={1}", person.Age, person.Name);dynamic dynamicSecond = Mapper.Map<ExpandoObject>;dynamicSecond.Address = "法国巴黎";Console.WriteLine("dynamicObj.Age={0},Name={1},Address={2}", dynamicSecond.Age, dynamicSecond.Name, dynamicSecond.Address);return dynamicSecond;}

扁平化

性相相称。 假设对指标项目上的其余性质,方法或以“Get”为前缀的措施不设有源类型上,则AutoMapper会将对象成员名称拆分为单个单词(听从帕斯卡(PascalCase)拼写法约定)。Ex:public class Order{public Customer Customer { get; set; }public decimal GetTotal(){return 100M;}}public class Customer{public string Name { get; set; }}public class OrderDto{public string CustomerName { get; set; }public decimal Total { get; set; }}当使用 Order与OrderDto映射时,Total属性相称到了Order上的GetTotal方法。CustomerName属性相称到了Order上的Customer.Name属性。可想而知,只要适度地命名目的项目属性,我们就不用配置单独的天性匹配。

List和数组

AutoMapper只供给成分类型的安排而不须求只怕会用到的别的数组或然list类型。因而的创建映射的计划中,只是安顿项目之间的投射,而无需规划任何聚众类型。具体来讲,帮助的源集合类型包涵:

    • IEnumerable
    • IEnumerable<T>
    • ICollection
    • ICollection<T>
    • IList
    • IList<T>
    • List<T>
    • Arrays

会见中的多态成分类型

AutoMapper支持多态数组和聚合,由此一旦发掘派生的源也许目的项目就能够自行转变,但成立的时候必要申明。Ex:cfg.CreateMap<ParentSource, ParentDestination>().Include<ChildSource, ChildDestination>();但也急需证明子类型的炫目,因为AutoMapper“猜不出”具体是哪个子类型Ex:cfg.CreateMap<ChildSource, ChildDestination>();也得以评释子类型的投射,再包涵基类型,但也要再声称基类型的映射Ex:cfg.CreateMap<ParentSource, ParentDestination>();cfg.CreateMap<ChildSource, ChildDestination>().IncludeBase<ParentSource, ParentDestination>();

接轨映射属性

对二个本性的酷炫有八种方法,下边是这个源的初期级

    • 显式映射 (使用.MapFrom
    • 后续的显式映射
    • 暗许的映射 (通过暗许相配的属性)
    • 不经意的质量映射

Ex: cfg.CreateMap<Order, OrderDto>().Include<PCOrder, OrderDto>().Include<MobileOrder, OrderDto>().ForMember(o => o.Referrer, m => m.Ignore;//这里配置了忽略指标属性Referrer的炫丽纵然在安插中忽视了Referrer的照射管理,但依然会将源类型中的Referrer属性值给到目的。那正是预先级的难点。那就是因为 暗中同意的映射比忽略的映照优先级高。

Null值替换

当源类型中某些属性为空值的时候在炫酷到对象项目时,目的项目标该属性能够设置一个暗中同意值NullSubstitute(),若是源属性为空,则用该方法设置默许值。Ex: cfg.CreateMap<Person, PersonInfo>().ForMember(dest => dest.Title, opt => opt.NullSubstitute;

吐放泛型

所谓的吐放泛型是指 源类型为三个泛型类,目的项目也是贰个泛型类型。在创造多少个泛型类的照射时,中的泛型没有供给填写。Ex: cfg.CreateMap(typeof(Source<>), typeof(Destination<>));也足以动用八个泛型转变器来进展管理。Ex: cfg.CreateMap(typeof(Source<>),typeof(Destination<>)).ConvertUsing(typeof(Converter<>));

投影

当把二个源值投影到八个不精准相称源结构的对象值时,必得指明成员映射定义。MapFrom() :钦命源类型属性的值。Ex: .ForMember(dest => dest.伊芙ntDate, opt => opt.MapFrom(src => src.Date.Date))学习来源:

本文由澳门太阳娱乐手机登录发布于 资质荣誉,转载请注明出处:AutoMapper总结

关键词: