C# 编写自动映射代码的最有效方法?
我最近给了Automapper一个机会,一旦我让它工作起来,它绝对是棒极了。问题是,我为安装Automapper而必须编写的实际代码有点粗糙,我想知道我的工作方式是否可以改进或简化。我正在使用它(在下面的示例中)将实体转换为viewmodel。字段名完全不同,因此我必须手动创建映射(AFAIK) 我的主要问题是:C# 编写自动映射代码的最有效方法?,c#,automapper,C#,Automapper,我最近给了Automapper一个机会,一旦我让它工作起来,它绝对是棒极了。问题是,我为安装Automapper而必须编写的实际代码有点粗糙,我想知道我的工作方式是否可以改进或简化。我正在使用它(在下面的示例中)将实体转换为viewmodel。字段名完全不同,因此我必须手动创建映射(AFAIK) 我的主要问题是: 字段名是否必须像这样明确映射,因为名称如此不同 有没有一种方法可以只写第一张地图,然后把它也用在第二张地图上?Entity->ViewModel与ViewModel->Entity相同
如果字段名有一个明确的模式,如示例中的
cm
,您可以查看定义约定。看见也许这样就可以解决大部分问题了?如果字段名不同,您必须这样做,对于双向,您只能编写一个映射,并在末尾添加:
.ReverseMap()
您的所有转换似乎都遵循相同的模式:成员X映射到成员cm_X。如果是这种情况,您可以将代码简化为:
Mapper.Initialize(cfg => {
// will remove "cm_" from destination when matching
// the fact you have different casing (Address vs cm_address)
// is fine and is already handled
cfg.RecognizeDestinationPrefixes(new [] {"cm_"});
// will remove "cm_" from source when mapping
cfg.RecognizePrefixes(new[] { "cm_" });
// will map in both directions
cfg.CreateMap<Entity, Dto>().ReverseMap();
});
Mapper.Initialize(cfg=>{
//匹配时将从目标中删除“cm_3;”
//事实上,您有不同的外壳(地址与cm_地址)
//很好,已经处理好了
cfg.RecognizeDestinationPrefixes(新[]{“cm_});
//映射时将从源中删除“cm_3;”
cfg.RecognizePrefixes(新[]{“cm_});
//将映射到两个方向
CreateMap().ReverseMap();
});
谢谢,我的实体设计并不完全遵循这一点,“cm_”会根据表名进行更改,属性名中可能会有下划线(“例如first_name”),但这是朝正确方向迈出的一大步,这应该不是问题,因为您可以添加许多前缀(这是字符串数组)。下划线也可以处理。
.ReverseMap()
Mapper.Initialize(cfg => {
// will remove "cm_" from destination when matching
// the fact you have different casing (Address vs cm_address)
// is fine and is already handled
cfg.RecognizeDestinationPrefixes(new [] {"cm_"});
// will remove "cm_" from source when mapping
cfg.RecognizePrefixes(new[] { "cm_" });
// will map in both directions
cfg.CreateMap<Entity, Dto>().ReverseMap();
});