为什么我必须在AutoMapper中创建一个Map

时间:2012-08-10 10:04:43

标签: c# automapper

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

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

这是典型案例吗“如果你不喜欢软件不使用它”

或者是否有一种更简单的方法可以在我不知道的一行中进行映射?

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

5 个答案:

答案 0 :(得分:4)

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

Mapper.DynamicMap<MyType>(mySourceObject);

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

答案 1 :(得分:1)

我认为你可以看到“CreateMap&lt;&gt;”作为使用automapper注册映射的方法。 “Map()”实际上正在执行已注册的映射。

“CreateMap&lt;&gt;”有额外的方法来细化你的映射,这本身就是分离这两种方法的一个原因。把它想象成“关注的分离”原则。

一个衬里包装

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();
    }
}

答案 2 :(得分:0)

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

Mapper.AssertConfigurationIsValid(); 

检查映射是否有效。

为了简化操作,您可以创建一个放置所有映射的位置(例如,对于ASP.NET MVC,您可以将它放在Global.asax的ApplicationStart中)

btw,对于Map-method,您还可以使用以下内容:

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

答案 3 :(得分:0)

陷阱...... EmitMapper:一个单行,但丑陋地读作地狱; - )

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

http://emitmapper.codeplex.com/

答案 4 :(得分:0)

这就是为什么我更喜欢Value Injector用于简单的1&lt; 1&gt; 1映射。在此处阅读:http://valueinjecter.codeplex.com/

这很简单:

myObject.InjectFrom(anyOtherObject);

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