C# 中AutoMapper的使用方法
译文链接:https://www.infoworld.com/art...
AutoMapper是一个非常流行的object-to-object映射库,它的目的就是帮助你实现不同类型对象之间的映射,举一个例子,在DDD开发模式中,你可能需要实现将DTOobject映射为Modelobject,在过去,你需要人肉的将这两个类型下的属性字段进行一一映射,现在AutoMapper就可以帮你节省这种冗余的模板式代码匹配所耗费的时间。
开始玩AutoMapper之前,你需要在VisualStudio中创建一个Project并且安装AutoMapper,你可以从NuGet上下载,也可以在NuGetPackageManagerConsole控制台输入如下命令:
PM>Install-PackageAutoMapper
使用AutoMapper创建映射关系
像AutoMapper这样的object-to-object映射工具,它必须能够做到将一种输入类型转换成另一个输出类型,是不是很拗口,可以先考虑下面的两个类。
publicclassAuthorModel { publicintId { get;set; } publicstringFirstName { get;set; } publicstringLastName { get;set; } publicstringAddress { get;set; } } publicclassAuthorDTO { publicintId { get;set; } publicstringFirstName { get;set; } publicstringLastName { get;set; } publicstringAddress { get;set; } }
接下来,下面的代码段将会告知你如何使用AutoMapper在AuthorModel和AuthorDTO这两个对象之间创建一个mapping关系。
varconfig=newMapperConfiguration(cfg=>{ cfg.CreateMap(); });
最终的mapping转换,你还需要增加几句下面的代码,实现两个类型之间的转换。
IMapperiMapper=config.CreateMapper(); varsource=newAuthorModel(); vardestination=iMapper.Map(source);
一个AutoMapper的例子
接下来可以上一些数据了,可以参考下面的代码片段,我准备先在sourceobject上赋值,然后执行AutoMapper中的Map方法之后,在destinationobject上原样显示出来。
varconfig=newMapperConfiguration(cfg=>{ cfg.CreateMap(); }); IMapperiMapper=config.CreateMapper(); varsource=newAuthorModel(); source.Id=1; source.FirstName="Joydip"; source.LastName="Kanjilal"; source.Address="India"; vardestination=iMapper.Map (source); Console.WriteLine("AuthorName:"+destination.FirstName+""+destination.LastName);
当你执行完这段代码之后,destinationobject上的AuthorName将会输出到控制台上,目标对象上的FirstName和LastName和sourceobject上的这两个属性值保持一致,说明automapper已经帮你成功映射。
值得注意的是,AutoMapper不仅仅可以mapping一个类,还可以mapping多个类,默认情况下,AutoMapper会按照默认约定匹配,也就是被mapping的对象之间具有相同的属性名称才能被成功映射,但现实情况下,很多被映射的属性名称是不相同的,这个时候就需要人工介入指定mapping关系让AutoMapper按照你设定的执行,假定你需要实现Contact到ContactDetails之间的映射,下面的例子展示了如何去实现这种关系。
varconfig=newMapperConfiguration(cfg=>{ cfg.CreateMap() .ForMember(destination=>destination.ContactDetails, opts=>opts.MapFrom(source=>source.Contact)); });
下面的语句可以创建最终的destinationobject对象。
vardestination=iMapper.Map(source);
有时候你已经生成了destinationobject,在这基础上你还想二次映射,这时可以使用下面替代语句。
iMapper.Map(sourceObject,destinationObject);
本质上来说,上面的这段代码常用于匹配两个已存在的object。
使用AutoMapping的projections功能
AutoMapper提供了非常好的projections功能,projections