【问题标题】:Domain to ViewModel Design?域到 ViewModel 设计?
【发布时间】:2014-08-17 22:08:23
【问题描述】:

我想知道以下最佳设计。我有类似的领域模型:

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

在我的域模型中,我还有从 Car 继承的燃料特定汽车的模型,例如:

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
}

在我看来,目前我只有一个普通的汽车视图模型。使用一些通用属性,然后根据哪种燃料类型为柴油或汽油渲染局部视图 - 同样,此局部视图仅采用完整的 CarView 模型,因为每个局部视图也有通用属性。

但是,我不想将多个属性从视图模型映射到我的控制器中的域,然后将域映射到我的视图模型构建器中的视图模型,我想利用自动映射器来做到这一点。

但是我认为这意味着在 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 构造函数中新建每个这些类,然后将每个域模型映射到视图模型上的相应类在 AutoMapper 中反之亦然?

也许任何人都可以提出比我想念的更好的方法吗?

【问题讨论】:

  • 我会尝试动态映射,您不必提前配置映射。
  • @WiktorZychla - 您是否有此 Wiktor 示例的链接,或者您能否详细说明答案中的示例?
  • 可能需要重新考虑您的域模型。一旦您尝试添加其他功能,使用继承就会崩溃。
  • @Cerad - 不确定你的意思?你能举一个你认为这会如何“爆炸”的例子吗?
  • 好吧,如果您想跟踪变速箱的类型(手动与自动)怎么办。

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-01-02
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多