使用具有截然不同的域和视图模型的映射框架?

时间:2012-06-27 18:13:24

标签: c# asp.net-mvc viewmodel automapper valueinjecter

如果我有两个非常不同的模型,那么即使使用Auto MapperValue Injecter等映射框架也会失败吗?

例如,假设我有两个结构相同的模型,但每个属性名称都不同,因此所有按惯例逻辑都无用。是否坚持手动映射这两个模型?

我想我主要是想了解:

1)除了我从其惯例映射中获得的代码节省之外,使用映射框架是否有任何好处?

2)在这种情况下,在映射框架中设置上述场景的映射与在这种情况下手动映射是否更容易? (看起来不像。)

2 个答案:

答案 0 :(得分:1)

1)除了我从其惯例映射中获得的代码节省之外,使用映射框架是否有任何好处?

我是这么认为的。这是一种一次性的事情之一。当然,您可以将代码从一个对象手动编写到另一个对象,可能与创建所有自定义映射规则的速度一样快。但是第二次需要DTO时,使用映射框架可以收回成本。

2)在这种情况下,在映射框架中设置上述场景的映射与在这种情况下手动映射是否更容易? (看起来不像。)

我认为它大致相同:

Mapper.CreateMap<EntityModel, ViewModel()
    .ForMember(d => d.Prop1, o => o.MapFrom(s => s.Property1))
    .ForMember(d => d.Prop2, o => o.MapFrom(s => s.Property2))
    .ForMember(d => d.Prop3, o => o.MapFrom(s => s.Property3))
        ...
    .ForMember(d => d.PropN, o => o.MapFrom(s => s.PropertyN))
;

通过此映射,您的所有DTO代码将如下所示:

var model = Mapper.Map<ViewModel>(entityInstance);

...对......如果你手动点击它,它看起来和我一样:

var model = new ViewModel
{
    Prop1 = entityInstance.Property1,
    Prop2 = entityInstance.Property2,
    Prop3 = entityInstance.Property3,
        ...
    PropN = entityInstance.PropertyN,
};

关于AutoInper over ValueInjecter的另一个很酷的事情是你只需要定义1个映射,然后它将用于映射单个实例和集合。

var models = Mapper.Map<ViewModel[]>(entityInstances);

...与

var models = entityInstances.Select(new ViewModel
{
    Prop1 = entityInstance.Property1,
    Prop2 = entityInstance.Property2,
    Prop3 = entityInstance.Property3,
        ...
    PropN = entityInstance.PropertyN,
});

答案 1 :(得分:0)

  

例如,假设我有两个结构相同的模型,   但每个属性名称都不同,

正在设计视图模型=&gt;您可以完全控制它们(与您的域模型相反,例如,可能是从数据库或设计者自动生成的域模型)=&gt;你可以相应地命名他们的属性: - )