C# 将映射框架与截然不同的域和视图模型一起使用?

C# 将映射框架与截然不同的域和视图模型一起使用?,c#,asp.net-mvc,viewmodel,automapper,valueinjecter,C#,Asp.net Mvc,Viewmodel,Automapper,Valueinjecter,如果我有两个非常不同的模型,那么使用诸如或之类的映射框架是否有违目的 例如,假设我有两个结构相同的模型,但每个属性名称都不同,因此按约定逻辑呈现所有属性都是无用的。坚持手动映射这两个模型也一样吗 我想我主要是想理解: 1) 使用映射框架除了从其按约定映射中节省代码之外,还有什么好处吗 2) 在映射框架中为上述场景设置映射是否比在这种情况下手动映射更容易?(看起来不是这样的。) 例如,假设我有两个结构相同的模型, 但每一处房产的名称都不一样 是您设计视图模型=>您可以完全控制它们(与您的域模型相反

如果我有两个非常不同的模型,那么使用诸如或之类的映射框架是否有违目的

例如,假设我有两个结构相同的模型,但每个属性名称都不同,因此按约定逻辑呈现所有属性都是无用的。坚持手动映射这两个模型也一样吗

我想我主要是想理解:

1) 使用映射框架除了从其按约定映射中节省代码之外,还有什么好处吗

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

例如,假设我有两个结构相同的模型, 但每一处房产的名称都不一样

是您设计视图模型=>您可以完全控制它们(与您的域模型相反,域模型可能是由数据库或设计器自动生成的)=>您可以相应地命名它们的属性:-)

例如,假设我有两个结构相同的模型, 但每一处房产的名称都不一样

是您设计视图模型=>您可以完全控制它们(与您的域模型相反,域模型可能是由数据库或设计师自动生成的)=>您可以相应地命名它们的属性:-)

1)使用映射框架除了从其按约定映射中节省代码之外,还有什么好处吗

我想是的。这是一种一次性的东西。当然,您可以编写代码来手动从一个对象到另一个对象进行DTO,速度可能与创建所有自定义映射规则的速度差不多。但是,当您第二次需要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))
;
AutoMapper over ValueInjector的另一个很酷的地方是,您只需要定义1个映射,然后就可以映射单个实例和集合

var models = Mapper.Map<ViewModel[]>(entityInstances);
1) 使用映射框架除了从其按约定映射中节省代码之外,还有什么好处吗

我想是的。这是一种一次性的东西。当然,您可以编写代码来手动从一个对象到另一个对象进行DTO,速度可能与创建所有自定义映射规则的速度差不多。但是,当您第二次需要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))
;
AutoMapper over ValueInjector的另一个很酷的地方是,您只需要定义1个映射,然后就可以映射单个实例和集合

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

我同意,但有时对于遗留代码(域模型),您希望借此机会稍微清理一下。或者,为了更容易地映射,您还会让您的新模型与设计糟糕的域模型相匹配吗?我同意,但有时对于遗留代码(域模型),您希望借此机会稍微清理一下。或者,为了更容易映射,您还会让您的新模型与设计糟糕的域模型相匹配吗?在隐式或显式运算符(转换)中定义手动映射会更容易,不是吗?@k0stya,对不起,我不懂。在隐式或显式运算符(转换)中定义手动映射会更容易,不会吗?@k0stya,对不起,我不懂。AutoMapper旨在通过应用约定来摆脱您已经编写的代码。如果没有映射模式,有什么意义?更重要的是,这些模型离我们还有多远?AutoMapper旨在通过应用约定来摆脱您已经编写的代码。如果没有映射模式,有什么意义?更重要的是,这些模型离我们有多远?
var models = entityInstances.Select(new ViewModel
{
    Prop1 = entityInstance.Property1,
    Prop2 = entityInstance.Property2,
    Prop3 = entityInstance.Property3,
        ...
    PropN = entityInstance.PropertyN,
});