【问题标题】:Why do I have to create a Map in AutoMapper为什么我必须在 AutoMapper 中创建地图
【发布时间】:2013-04-23 20:21:55
【问题描述】:

为什么我必须调用 .CreateMap 方法?

其实很明显调用.Map方法有相同的source/destination参数。

这是一个典型的案例“如果你不喜欢这个软件就不要使用它”

或者有没有一种更简单、不那么麻烦的方法来在我不知道的一行中进行映射?

Mapper.CreateMap<ReleaseViewModel, Release>();
Release release = (Release)Mapper.Map(releaseViewModel, typeof(ReleaseViewModel), typeof(Release));

【问题讨论】:

    标签: c# automapper


    【解决方案1】:

    我有一段时间对同样的事情感到困惑,如果我只想用零配置映射对象 a-b 怎么办?好吧,事实证明有一种方法:

    Mapper.DynamicMap<MyType>(mySourceObject);
    

    Map 旨在用于源和目标之间的合同始终明确定义的情况。因此,本合同的遗漏违反了这一使用原则。

    【讨论】:

      【解决方案2】:

      我认为您可以将“CreateMap”视为使用 automapper 注册映射的方法。 “Map()”实际上是在执行注册的映射。

      “CreateMap”具有额外的方法来细化您的映射,这本身就是将这两种方法分开的原因。将其视为“关注点分离”原则。

      一个衬垫包装纸

      public abstract class Mapper<TFrom, TTo>
      {
          private void Configure()
          {
              Mapper.CreateMap<TFrom, TTo>();
          }
      
          public TTo Map(TFrom @from)
          {
              Configure();
              return Mapper.Map<TFrom, TTo>(@from);
          }
      
          public IEnumerable<TTo> Map(IEnumerable<TFrom> fromList)
          {
              return fromList == null
                  ? null 
                  : fromList.Select(Map).ToList();
          }
      }
      

      【讨论】:

      • 是的,CreateMap 确实可以做复杂的事情。但是当我想要一个 1:1 的映射时,作者仍然应该提供一个单行。我不想围绕一些属性副本构建架构;-)
      • 我认为您可以使用 Automapper.Mapper 对象上的简单包装器轻松解决这个问题。检查我的编辑。
      【解决方案3】:

      这是一种将映射注册到 AutoMapper 的方法。此方法的一个优点是您可以调用

      Mapper.AssertConfigurationIsValid(); 
      

      检查映射是否有效。

      为方便起见,您可以创建一个放置所有映射的地方(例如,对于 ASP.NET MVC,您可以将其放置在 Global.asax 的 ApplicationStart 中)

      顺便说一句,对于您的 Map 方法,您还可以使用以下方法:

      Release release = Mapper.Map<ReleaseViewModel,Release>(releaseViewModel);
      

      【讨论】:

      • 是的,我看到了另一种方法,但知道我理解它的含义,哈哈 ;-) 我尝试了 valueinjecter 及其完美,但它不返回业务对象(Release),它必须始终手动实例化:/ 我是寻找单线工具...
      【解决方案4】:

      明白了... EmitMapper:一个单行但很难读到地狱;-)

      Release release = ObjectMapperManager.DefaultInstance.GetMapper<ReleaseViewModel,Release>().Map(releaseViewModel);
      

      http://emitmapper.codeplex.com/

      【讨论】:

        【解决方案5】:

        这就是为什么我更喜欢 Value Injector 用于简单的 11 映射。在这里阅读:http://valueinjecter.codeplex.com/

        就这么简单:

        myObject.InjectFrom(anyOtherObject);
        

        并且将隐式映射具有相同名称和类型的属性。

        【讨论】:

        • 阅读我对用户“Pbirkoff”的评论,你就会知道为什么 valueinjecter 不是一个单一的 :)
        猜你喜欢
        • 1970-01-01
        • 2020-06-12
        • 2016-10-01
        • 1970-01-01
        • 2017-07-08
        • 2021-08-16
        • 1970-01-01
        • 2015-05-16
        • 1970-01-01
        相关资源
        最近更新 更多