为什么我必须调用.CreateMap方法?
实际上,显然调用.Map方法具有相同的源/目标参数。
这是典型案例吗“如果你不喜欢软件不使用它”
或者是否有一种更简单的方法可以在我不知道的一行中进行映射?
Mapper.CreateMap<ReleaseViewModel, Release>();
Release release = (Release)Mapper.Map(releaseViewModel, typeof(ReleaseViewModel), typeof(Release));
答案 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);
答案 4 :(得分:0)
这就是为什么我更喜欢Value Injector用于简单的1&lt; 1&gt; 1映射。在此处阅读:http://valueinjecter.codeplex.com/
这很简单:
myObject.InjectFrom(anyOtherObject);
并隐式映射具有相同名称和类型的属性。