如何正确模拟这种多态关联?

时间:2011-01-13 17:39:55

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

鉴于以下实体:

容器
用户
客户端
机构

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

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

此关系的推荐域模型是什么。

我考虑过以下选项:

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

Container.AssignedToUsers
Container.AssignedToClients
Container.AssignedToInstitutions

这似乎非常不优雅,但不需要业务逻辑来检查类型或进行任何向下转换。

2)为用户/客户/机构创建公共基类“Party”

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

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

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

这至少会提供某种类型的安全性,但需要进行类型检查和向下转换。

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

任何建议表示赞赏。

1 个答案:

答案 0 :(得分:0)

根据你对我的问题的评论,我根本不会让容器处理任务。要使用您的示例,文件不知道或不关心谁在观看它。

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