【问题标题】:How to Correctly Model this Polymorphic Association?如何正确建模这个多态关联?
【发布时间】:2011-01-13 17:39:54
【问题描述】:

给定以下实体:

容器
用户
客户
机构

Container 实体通过属性AssignedToParties 与一个或多个参与方建立关联。

Container.AssignedToParties 可以包含用户、客户和机构的组合。

这种关系的推荐领域模型是什么。

我考虑过以下选项:

1) 为每种类型创建单独的属性:

Container.AssignedToUsers
Container.AssignedToClients
Container.AssignedToInstitutions

这看起来很不优雅,但不需要业务逻辑来检查类型或进行任何向下转换。

2) 为用户/客户/机构创建一个通用基类“Party”

Container.AssignedToParties 将是 Party 实体的集合。这似乎是一个尴尬的解决方案,因为 Party 基类没有任何方法或属性。我也不确定我是否喜欢在这里添加一层继承的想法。

此解决方案与 #3 一样,需要系统在运行时检查类型以做出决策,然后向下转换到用户/客户/机构来处理它们。

3) 创建用户/客户/机构实施的标记接口 IContainerAssignable

这至少会提供一些类型安全,但需要类型检查和向下转换。

现在,我倾向于#3。这似乎是最简单的,但我在一些地方读到过,如果你的代码正在运行必须测试给定类型的逻辑并且你可能有一个糟糕的设计。

任何建议表示赞赏。

【问题讨论】:

  • 用户、客户和机构有什么共同点让他们想要共享一个容器而不是存在于不同的容器中?
  • 容器不包含用户/客户/机构。它是一个域对象,表示文件等资产列表。用户/客户/机构与容器相关联,以表明他们对它们的兴趣。您可以将它们视为“监视”容器。仅供参考,客户/用户共享一个公共基类 Person。机构实际上不是一个人,除了可分配给容器之外,就其属性或行为而言,它与客户/用户不共享任何内容。

标签: domain-driven-design polymorphic-associations oop


【解决方案1】:

根据您对我的问题的评论,我根本不会让容器处理分配。以您的示例为例,文件不知道也不关心谁在看它。

相反,我要么让观察者实现一些方法(或集合属性)来开始观察容器(在这种情况下,将它们设为 IContainerWatcher 或类似的东西是有意义的),或者让观察功能卸载完全融入专门维护关联的服务中,就像发布/订阅机制一样。这在概念上类似于数据库模式中的多对多连接表。

【讨论】:

  • 我稍微简化了示例以帮助集中问题。在我们的业务中,让容器知道谁在看它是很重要的。容器是一个非常复杂的对象,有很多行为取决于谁在“观察”它。能够以相反的方向传播这些实体之间的关系也很重要,即查看与客户/用户/机构关联的容器。 IContainerWatcher 会类似于#3 (IContainerAssignable) 吗?您对使用 Marker 类有何看法?谢谢!
  • 标记接口可用于声明意图等,我认为它们很好。也就是说,我会努力看看它们之间是否有一些共同的行为,即使这是在容器发生变化时使用的常用方法或事件(如观察者模式)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多