在 OOD 中向业务实体添加对象成员

Adding object members to business entities in OOD

我有 2 个业务实体(对象):产品和订单。除了一些其他属性外,Product 对象还包含 "Name" 属性。除了指向 Product 的 属性 之外,Order 实体还包含 "Id, Date ... etc" 属性(为简单起见,假设一个订单只能有一个产品)

在我的例子中,当我想显示订单列表时,我想显示每个订单的产品名称,但我不需要显示其他产品的属性。

我的问题是,当我设计 Order 实体 class 时,我应该添加一个指向 Product 的 属性,还是应该简单地添加一个名为 [=20] 的 属性 =]?如果答案是添加一个指向 Product 的 属性,是否可以仅加载名称 属性 或者我也应该填写所有其他属性(在从 DB 检索数据时) )?

如果您能添加一些包含您的答案的文章的链接,我将不胜感激。

您的问题中似乎假设订单显示对象必须与订单实体 1-1 匹配。

我认为您尝试将每个订单简化为一种产品,这给自己挖了个坑。

如果您有一个连接 table(OrderProducts?或者更好的是 OrderLines。订单和产品实体都不必 'know' 彼此相关。 您可以保持这些简洁明了,并将此 DisplayOrders 函数委托给新的加入实体。

也许如果我假装是客户并说我希望订单显示不再显示 ProductName 而是显示总订单价值。

这将对您的实体进行大量调整,如果您坚持这个 1-1 匹配的想法,您的数据库也是如此。

不要去那里。改变是必然的。 知识产权 评论后...

如果真的是一对一的关系,那么就不需要两个实体了。 1-1 表示每个订单一个产品,每个产品一个订单。

鉴于你的问题,我确实愚蠢地假设事实上你可以多次订购一个产品。

因此,大多数有趣的方法(除了两个实体的基本 crud 之外)都是基于两个实体之间的关系。那是您应该建模的域的一部分。

更多评论后...

除非我正在优化性能,否则我从不反规范化,如果我没有更好的选择,我会这样做 'last'。

如果你说的是需要一个 属性 从属对象,我会即时创建实体,然后将 publisherid 放在图书实体上。

我这样做的前提是发布者实体的名称 属性 可以更改。非规范化意味着我必须捕获对出版商名称的更改,通读所有书籍并更改它们的名称。更糟糕的是,其中还有一个隐藏的假设,即发布者名称是唯一的。现在你可能会这样做,但为了避免一个真正可怕的错误,如果某个用户的鼻屎给两个发布者同名,你必须强制执行它。

在这个有意限制的示例之外的现实世界中,我希望有一些功能分配给伪实体 BookListItem(例如,为阅读列表或购物车选择它),我会受到严重的诱惑由第三个第一个 class 实体 BookListItem,也许还有第四个 BookList。

所有的设计都是妥协的,如果你要经常查看书单,出版商名称将是一个千载难逢的机会,你准备好应对身份问题,你可以预见到这种行为不会改变,那么非规范化是一个很好的折衷方案。

在某些方面,您的问题没有正确答案,您需要清楚的是您的设计允许/启用的内容以及它施加的限制,例如PublisherName 是唯一的,这在要求中无处可寻,可能会导致您的客户给您起不同的名字....

HtHs

这只是 CQRS 的问题。要显示任何与 UI 相关的内容,只需要一个查询处理程序(服务)直接从数据库(持久性)获取所需的视图模型数据,因此跳过 Business/Domain 层。就这样。 您不应根据UI 需求 来设计您的业务模型。

在处理更改业务模型的状态时(Command CQRS 的一部分),设计应该反映概念及其关系。在您的情况下,Order references 一个或多个使用其 Id 的产品。此模型不应该用于查询,仅用于 create/update。

要查询事物,根据您的持久性实现,您可以使用现有的数据库数据或在域状态更改时(通过域事件处理程序)自动创建的用例相关读取模型(但这是一个更复杂的情况,它取决于适当的领域事件设计、基于消息的架构和不易查询的存储。