Domain driven design 域模型-层之间的实体对象

Domain driven design 域模型-层之间的实体对象,domain-driven-design,entity,Domain Driven Design,Entity,这可能看起来像是一个老生常谈的问题,但却找不到答案 我正在开发一个简单的订单处理应用程序。相当多的领域逻辑,所以我选择了领域模型模式。每个订单都有一个名为“普通”或“快速”的“订单类型” 我有一个Order实体,我公开了一个名为OrderTypeID的int属性,因为我认为可以将OrderType的Id存储在该int字段中。工作正常,但当我必须检索订单时,我可以填充回整数“order Type”Id,但我需要在屏幕上显示“OrderType-Express或普通”。所以,订单实体在进入持久化阶段

这可能看起来像是一个老生常谈的问题,但却找不到答案

我正在开发一个简单的订单处理应用程序。相当多的领域逻辑,所以我选择了领域模型模式。每个订单都有一个名为“普通”或“快速”的“订单类型”

我有一个Order实体,我公开了一个名为OrderTypeID的int属性,因为我认为可以将OrderType的Id存储在该int字段中。工作正常,但当我必须检索订单时,我可以填充回整数“order Type”Id,但我需要在屏幕上显示“OrderType-Express或普通”。所以,订单实体在进入持久化阶段时会使用Id,但当它返回时会变成文本

关于订单实体对象的建模,我应该如何做到这一点?我应该将订单类型存储为一个整体实体(可能是一个订单类型类0,如果是,那么“订单”类的存储库将如何分割订单类型,以便我只保留Id

任何要点都将不胜感激

干杯
VJ

一些建议/观察。
OrderType
听起来像是一种值类型,而不是实体。也许您可以实现为枚举?类似于

public enum OrderType { ordinary, express };
根据您的语言,您可能能够扩展枚举以返回更友好的表达式(例如,通过在java中重写
toString()
)。有关java枚举的更多详细信息

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

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

class Order {
  //....

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

  //...
}

Hth.

这不是一个被击败的问题,你可能需要考虑很多思考才能正确地回答。这些问题不仅是不幸的,与DDD有关。你可能需要考虑其他的标准,比如你将在数据库上保存这些信息的方式,或者如果你有依赖于TH的代码。e订单类型

第一个问题:如果添加一个订单类型会怎么样?为了让某些操作考虑到这些,您是否必须更改代码?如果是这样,您可以将订单类型定义为枚举…我说您可以…:)订单类型可能非常重要,您可以根据订单类型为每个订单定义特定的类,并具有公共的基本抽象类和使用继承

第二个问题:你真的需要知道你模型上的ID吗?订单类型1,订单类型2。。。模型上有什么意思吗。。。我不这么认为。很可能在所有业务逻辑中,您更喜欢处理OrderType.OrderType1或OrderType.OrderType2。在这种情况下,枚举更容易处理

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

我可以考虑其他的事情…有很多事情要考虑:

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

希望这有帮助