C# 编写自动映射代码的最有效方法?

C# 编写自动映射代码的最有效方法?,c#,automapper,C#,Automapper,我最近给了Automapper一个机会,一旦我让它工作起来,它绝对是棒极了。问题是,我为安装Automapper而必须编写的实际代码有点粗糙,我想知道我的工作方式是否可以改进或简化。我正在使用它(在下面的示例中)将实体转换为viewmodel。字段名完全不同,因此我必须手动创建映射(AFAIK) 我的主要问题是: 字段名是否必须像这样明确映射,因为名称如此不同 有没有一种方法可以只写第一张地图,然后把它也用在第二张地图上?Entity->ViewModel与ViewModel->Entity相同

我最近给了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();                
    });