在采用域驱动设计时,我经常遇到关于域对象的各种视角的问题,特别是在使用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的映射到数据库视图。
- 此对象是否属于域模型,还是更多应用程序/ GUI特定?
- 批次概览对象应引用批处理对象吗?
- 这是一种常见的模式?
- 有没有关于这个问题的任何指导?
DDD具有有界上下文的概念,但在这种情况下,上下文是相同的。 Batch类和BatchOverview类都引用相同的“实际”批次 - 它们是不同的视图或透视图。