这可能看起来像一个被打败的问题,但在SO没有找到答案。
我正在开发一个简单的订单处理应用程序。相当一个域逻辑,所以我选择了域模型模式。每个订单都有一个名为“普通”或“快递”的“ OrderType ”。
我有一个Order实体,我暴露了一个名为OrderTypeID的int属性,因为我认为我可以在该int字段中存储OrderType的Id。工作得很好,但是当我必须检索订单时,我可以填充整数“订单类型”ID,但我需要在屏幕上显示“OrderType - Express或Ordinary”。因此,当它归结为持久性时,Order实体与Id一起使用,但当它返回时,它应该成为一个文本!!!!
如何将Order实体对象建模,如果我将Ordertype存储为整个实体(可能是OrderType class0,如果是,那么“Order”类的存储库将如何拆分Ordertype所以我只坚持Id?
任何要点都会受到赞赏
干杯 VJ
答案 0 :(得分:0)
一些建议/意见。 OrderType
听起来像值类型,而不是实体。也许你可以实现枚举?像
public enum OrderType { ordinary, express };
根据您的语言,您可以扩展枚举以返回更友好的表达式(例如,通过覆盖java中的toString()
)。有关java枚举的更多详细信息here。
即使您不能/选择不使用枚举,原则也是相同的:实现toString()
以返回有意义的值。在这两种情况下,它都使得OrderType类具有人类可读的值。您还应该使实例不可变(使用枚举隐式)。
假设Order
是您的聚合根,您将公开一个接受/返回OrderType
实例的接口 - 而不是整数。例如:
class Order {
//....
public OrderType getOrderType() {...};
public void setOrderType (OrderType orderType) {...}
//...
}
第h
答案 1 :(得分:0)
这不是一个被打败的问题,你可能需要考虑很多想法才能正确回答它。不幸的是,这些问题不仅与DDD有关。您可能必须考虑其他条件,例如您要在数据库中保留此信息的方式,或者您是否拥有依赖于订单类型的代码。
第一个问题:如果添加订单类型该怎么办?您是否必须对代码进行更改才能将某些操作考虑在内?如果是这样你可以将订单类型定义为枚举...我说你可能...... :)订单类型可能是重要的,你可以根据订单类型为每个订单定义特定的类,并有一个共同的基础抽象类并使用继承。
第二个问题:您真的需要知道模型上的ID吗?订单类型1,订单类型2 ...表示模型上的任何内容...我不这么认为。大概可能比你所有的商业逻辑更喜欢处理它有OrderType.OrderType1或OrderType.OrderType2。在这种情况下,枚举更容易处理。
第三个问题:您可以在数据库中问自己相同的问题(如果这是您使用的持久性)。您是否需要与订单类型表的fK关系?这有性能成本。你可能会使用一个ID ...你能不能使用具有预定义值的DB数据类型。这是另一个主题,但它挑战了订单类型可能是一个实体的想法......
我可以考虑其他事情......有很多事情要考虑:)
最常见的解决方案是:对订单类型使用枚举,如果没有订单的操作逻辑特定于订单类型,则处理存储库中的转换。如果不考虑继承和面向对象。值类型可以是一个选项,但是您是否有很多订单类型的属性?如果没有那么没有值类型。 :)
希望得到这个帮助。