代码之家  ›  专栏  ›  技术社区  ›  eulerfx

域驱动设计中聚合的不同视角建模

  •  3
  • eulerfx  · 技术社区  · 14 年前

    在使用领域驱动的设计时,我经常遇到一个关于领域对象的不同视角的问题,特别是在使用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具有有界上下文的概念,但是在这种情况下,上下文是相同的。批处理类和批处理概述类都引用同一个“实际”批处理——它们是不同的视图或透视图。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Goblin    14 年前

    我会让新的类远离这个领域——这是我书中的一个表示问题,我会这样对待它。通常,这个新对象是只读的,这样就不会有两种方法来改变数据(其中一种方法不包含完整的业务逻辑集)。

    但是,您不必仅仅因为使用NHibernate就为值设置setter。只需使用一个支持字段,并让nhibernate写入该字段即可。(在映射中使用access=“field”)。

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

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