【问题标题】:Domain model - Entity object between layers领域模型 - 层之间的实体对象
【发布时间】:2011-11-22 18:24:33
【问题描述】:

这看起来像是一个老生常谈的问题,但在 SO 上找不到答案。

我正在开发一个简单的订单处理应用程序。有点域逻辑,所以我选择了域模型模式。每个Order 都有一个名为“Ordinary”或“Express”的“OrderType”。

我有一个 Order 实体,并且我公开了一个名为 OrderTypeID 的 int 属性,因为我认为我可以将 OrderType 的 Id 存储在该 int 字段中。工作正常,但是当我必须检索订单时,我可以填充整数“订单类型”ID,但我需要在屏幕上显示“订单类型 - 快递或普通”。因此,当 Order 实体归结为持久性时,它与 Id 一起使用,但当它返回时,它应该变成一个文本!!!!

对于 Order 实体对象的建模,我应该如何将 Ordertype 存储为一个整体实体(可能是 OrderType 类 0,如果是,“Order”类的存储库将如何拆分 Ordertype 所以我只保留 Id 吗?

任何积分将不胜感激

干杯 主播

【问题讨论】:

    标签: domain-driven-design entity


    【解决方案1】:

    一些建议/意见。 OrderType 听起来像是值类型,而不是实体。也许您可以实现为枚举?类似的东西

    public enum OrderType { ordinary, express };
    

    根据您的语言,您可以扩展枚举以返回更友好的表达式(例如,通过在 java 中覆盖 toString())。有关 java 枚举 here 的更多详细信息。

    即使你不能/选择不使用枚举,原理也是一样的:实现toString() 以返回一个有意义的值。在这两种情况下,它都使 OrderType 类固有的人类可读值。您还应该使实例不可变(使用枚举隐含)。

    假设Order 是您的聚合根,您将公开一个接受/返回OrderType 实例的接口 - 而不是整数。例如:

    class Order {
      //....
    
      public OrderType getOrderType() {...};
      public void setOrderType (OrderType orderType) {...}
    
      //...
    }
    

    hth.

    【讨论】:

      【解决方案2】:

      这不是一个老生常谈的问题,您可能需要考虑很多想法才能正确回答。不幸的是,这些问题不仅与 DDD 有关。您可能需要考虑其他标准,例如将这些信息保存在数据库中的方式,或者您是否有依赖于订单类型的代码。

      第一个问题:如果添加订单类型会怎样。您是否必须对代码进行更改才能使某些操作将这些考虑在内?如果是这样,您可以将订单类型定义为枚举...我说您可以... :) 订单类型可能非常重要,您可以根据订单类型为每个订单定义特定的类,并拥有一个通用的基本抽象类并使用继承。

      第二个问题:您真的需要知道您模型上的 ID 吗?订单类型 1,订单类型 2... 是否意味着模型上的任何内容...我不这么认为。最有可能的是,您更愿意使用 OrderType.OrderType1 或 OrderType.OrderType2 来处理它。在这种情况下,枚举更容易处理。

      第三个问题:您可以在数据库上问自己同样的问题(如果这是您用作持久性的内容)。您需要与订单类型表的 fK 关系吗?这有性能成本。而且您可能会为此使用 ID...您不能使用具有预定义值的 DB 数据类型。这是另一个主题,但它挑战了订单类型可以是实体的想法......

      我还可以考虑其他的事情...有很多事情要考虑:)

      最常见的解决方案是:使用枚举作为订单类型,并在没有订单的操作逻辑特定于订单类型的情况下处理存储库上的转换。如果不考虑继承和面向对象。值类型可能是一个选项,但您会为订单类型提供很多属性吗?如果不是,则没有值类型。 :)

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-03-10
        • 2012-12-18
        • 2013-10-14
        • 1970-01-01
        • 2016-03-14
        • 2015-12-30
        • 1970-01-01
        • 2014-03-23
        相关资源
        最近更新 更多