【问题标题】:Modeling varying perspectives of an aggregate in Domain Driven Design在领域驱动设计中对聚合的不同视角进行建模
【发布时间】:2010-07-26 17:24:33
【问题描述】:

在采用域驱动设计时,我经常遇到关于域对象的各种视角的问题,尤其是在使用 NHibernate 时。透视图本质上是查看域对象的方法。例如,简化模型:

class Transaction
{
  string Id { get; set; }
  string CustomerName { get; set; }
  DateTime Date { get; set; }
  decimal Amount { get; set; }
  decimal Tax { get; set; }
}

class Batch
{
    string Account { get; set; }
    string Number { get; set; }
    DateTime? ClearDate { get; set; }
    IList<Transaction> Transactions { get; }
    decimal Total { get; }
}

批次的总属性是每笔交易金额的总和。在考虑单个批次时,该模型运行良好,并且是域的正确表示。然而,客户端应用程序有一个显示批次集合的屏幕。该屏幕不需要有关批次内交易的任何详细信息,只需要总金额。在列表屏幕上使用相同的对象很慢。一种选择是使 Total 属性可设置,另一种选择是创建一个新类,例如:

class BatchOverview
{
    string Number { get; set; }
    decimal Total { get; set; }
}

这将有自己的存储库和自己的 NHibernate 映射到数据库视图。

  1. 此对象属于域模型,还是更特定于应用程序/GUI?
  2. 批次概览对象是否应该引用批次对象?
  3. 这是一种常见的模式吗?
  4. 是否有与此问题相关的指导?

DDD 具有限界上下文的概念,但在这种情况下,上下文是相同的。 Batch 类和 BatchOverview 类都引用同一个“实际”批次——它们是不同的视图,或对它的看法。

【问题讨论】:

    标签: nhibernate domain-driven-design


    【解决方案1】:

    我会将新类排除在域之外 - 这是我书中的一个演示问题,我会这样对待它。通常,这个新对象是只读的,因此不会有两种更改数据的方法(其中一种没有包含完整的业务逻辑集)。

    但是,您不必仅仅因为使用 nHibernate 就为该值创建一个设置器。只需让它使用一个支持字段并让 nHibernate 写入它。 (在映射中使用 access="field")。

    编辑: 根据内部逻辑的数量,我将其称为 PresentationModel 或 ViewModel。

    我可能会保留对原始对象的引用 - 但可能只是一个 Id。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2013-09-16
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      相关资源
      最近更新 更多