域到ViewModel设计?

时间:2014-08-17 22:08:23

标签: c# asp.net-mvc design-patterns domain-driven-design

我想知道以下最好的设计。我有域模型,如:

public class Car
{
   public string Name { get; set; }
   //Other common properties removed for Brevity
}

在我的领域模型中,我还拥有继承自Car的Fuel特定车型,如:

public class DieselCar : Car
{
   public bool RunOnBioDiesel { get; set; }
   //other diesel specific properties removed for brevity
}

public class PetrolCar : Car
{
   public int NoSparkplugs { get; set; }
   //other petrol specific properties removed for brevity
}

在我看来,目前我只有一个共同的汽车视图模型。使用了一些常见的属性,然后根据哪种燃料类型I渲染柴油或汽油的局部视图 - 这个局部视图再次采用完整的CarView模型,因为每个局部视图也有共同的属性。

但是,不是将多个属性从视图模型映射到我的控制器中的域,然后将域映射到我的视图模型构建器中查看模型,我想要使用automapper的优点来执行此操作。

但是我认为这意味着在AutomapperBootstrapper中有类似下面的东西(我不确定这甚至可以正常工作吗?)

Mapper.CreateMap<Domain.Car, CarViewModel>();
Mapper.CreateMap<Domain.DieselCar, CarViewModel>();
Mapper.CreateMap<Domain.PetrolCar, CarViewModel>();

Mapper.CreateMap<CarViewModel, Domain.Car>();
Mapper.CreateMap<CarViewModel, Domain.DieselCar>();
Mapper.CreateMap<CarViewModel, Domain.PetrolCar>();

我认为另一种方式是在我的视图模型中为CommonCarFields,DieselCarFields和PetrolCarFields提供三个不同的类,然后在CarViewModel构造函数中新建每个类,然后将每个Domain模型映射到viewmodel上的相应类在AutoMapper中反之亦然?

也许任何人都可以建议一种更好的方式来做到这一点,甚至比我想念的还要好?

1 个答案:

答案 0 :(得分:1)

如果我在视图中需要域模型中的每个属性,我会感到惊讶。在将数据发送到视图或通过线路发送时,我倾向于将数据展平。我发现在这两种情况下,如果你在你的域和视图模型中保持相同的对象图,然后在两者之间进行宗教映射,你可能在某处做错了。

每当我构建一个以应用程序为中心的应用程序时,这种直接映射就不会自然发生。另一方面,在以数据为中心的应用程序中,我经常看到数据库的结构被(错误地)强制通过每一层。