领域驱动设计共享实体

Domain-Driven Design shared Entity

我刚刚开始我的 领域驱动设计 职业之旅。我的 classes 模型有问题。下面是一个简化的 class 图。

我有两个限界上下文:人口问题

Person 是用至少一个文档创建的。 Person 可以报告一个新的 Issue 附加多个 IssueAttachment

我想将文件存储集中为单个 File 实体,我将在单个数据库 table 中保留该实体。中心化的原因是在持久化之前执行公共操作,例如数据压缩或获取 md5 hash。此外,将所有文件存储在一个 table 中简化了测试数据转储过程,因为我必须忽略一个 table 以排除大量的 blob。

然而,在阅读了很多文章后,我可以得出结论,不建议在各种上下文之间共享实体。

你能给我一些关于如何处理这样的问题的设计建议吗?

如果您已经确定了这两个限界上下文,那就太好了。请参考下图从俯视图了解。

现在,如果我们查看这些限界上下文中的每一个。在这种情况下,以洋葱架构为例,如图 2 所示。 (您可以选择适合您需要的任何架构)。

是的,你没有听错。确实,两个不同的限界上下文中的模型是不同的。目前,您可能会看到具有相同属性的相同 class。 但是由于它们处于不同的限界上下文中,因此它们对业务具有不同的含义。一旦你填补了你的基础设施与领域之间的空白,就可以按照下面描述的方式试一试。可能你会看到不同的意思。

但是在您的情况下,您对共享相同基础设施(例如:文件系统)的担忧可以在有界上下文的最外层处理,而无需担心或与您的域业务混合。

如图 2 所示,使用 shell 最外层的基础层与共享基础设施(例如:文件系统)进行交互。现在在域(分别是人口或问题上下文)中定义一个定义相应业务需求的接口。您可以在应用层中实现,您可以从那里与您的下层(具有相同的限界上下文)进行交互。反过来,您将能够与共享基础设施(文件系统)进行通信。

明天您将使用哪个基础设施以及基础设施发生的任何变化都没有关系,您的域业务仍然完好无损。因此,通过这种方式,您可以将事物隔离开来。在基础层中,更改非常少,并且具有某种映射器或适配器,您将能够与共享基础结构(文件系统)进行神奇的交互。

让我知道你的想法。