2010-07-26 70 views
3

在采用域驱动设计时,我经常遇到关于域对象的各种视角的问题,特别是在使用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; } 
} 

该批次的总属性是每笔交易金额的总和。当考虑单个批次时,这个模型运作良好,并且是该领域的适当表示。客户端应用程序具有显示批次集合的屏幕。该屏幕不需要关于批次内交易的任何细节,只需要总金额。在列表屏幕上使用相同的对象很慢。一种选择是使总资产是可设置的,另一种选择是创建一个新的类,如:

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

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

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

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

回答

3

我会让新课程脱离领域 - 这是我书中介绍的一个问题,我会这样对待它。通常情况下,这个新对象将是只读的,以免有两种改变数据的方式(其中一个不包含全套业务逻辑)。

但是,您不必因为使用nHibernate而为值设置setter。只要让它使用支持字段,并让nHibernate写入。 (在你的映射中使用access =“field”)。

编辑: 我称之为PresentationModel或ViewModel取决于内部逻辑的数量。

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