1

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

实际上很明显调用 .Map 方法具有相同的源/目标参数。

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

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

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

5 回答 5

4

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

Mapper.DynamicMap<MyType>(mySourceObject);

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

于 2013-04-23T12:21:55.133 回答
1

我认为您可以将“CreateMap<>”视为使用自动映射器注册映射的方法。“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();
    }
}
于 2012-08-10T10:07:59.353 回答
0

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

Mapper.AssertConfigurationIsValid(); 

检查映射是否有效。

为了更容易,您可以创建一个放置所有映射的位置(例如,对于 ASP.NET MVC,您可以将其放置在 Global.asax 的 ApplicationStart 中)

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

Release release = Mapper.Map<ReleaseViewModel,Release>(releaseViewModel);
于 2012-08-10T10:18:18.313 回答
0

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

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

http://emitmapper.codeplex.com/

于 2012-08-10T10:45:54.277 回答
0

这就是为什么我更喜欢 Value Injector 进行简单的 1<->1 映射的原因。在这里阅读:http: //valueinjecter.codeplex.com/

它很简单:

myObject.InjectFrom(anyOtherObject);

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

于 2012-08-10T12:06:41.457 回答