我正在使用 DDD 原则制作应用程序。在尽可能多地考虑了所有事情之后,我开始制作我的限界上下文。我还没有设置最终结构,但到目前为止,我的应用程序将包含以下有界上下文:
- 员工管理
- 购买
- 档案
- 报告
我希望它尽可能地可插拔,因此我可以例如单独开发和维护它们。他们可能会公开 WCF 或 Web API 以与他们交互。
我将使用Udi Dahans 实现一个简单的 CQRS 模式。我不想一直使用事件溯源、消息总线等,因为这不会是一个高度协作的应用程序(少于 1000 个用户,而且他们不太可能编辑相同的小数据集),这将增加了很多不必要的复杂性。
所以对于问题:
员工和部门实体对所有 BC 都是通用的,如何对其建模?
部门是组织结构的一部分,因此在员工管理 BC 中,员工在一个部门工作,他们可以管理一个部门,并且他们有他们工作过的部门的历史。
在采购 BC 中,商品从一个部门采购,然后交付给一个部门。供应商与不同部门有不同的合同。
在存档中,一些信息将被存档并绑定到一个部门,等等。
这几乎同样适用于员工。
如何持久化有界上下文中的数据?
它们可以映射到同一个数据库或每个都有自己的数据库。
到目前为止我的一些想法
如何建模
我应该再制作一个名为“公司”或“组织”的 BC 并在那里管理部门吗?
根据上面提到的 Udi Dahans 文章,我应该为每个 BC 创建一个部门实体和一个员工实体,其中包含我需要的 BC 字段和行为。这听起来很合理,但是我正在考虑如何实际使用它,但我无法弄清楚。我需要访问在其他地方管理的部门,但我究竟该怎么做而不是混合我的 BC?
如何使用?
假设我通过查询从某个地方获取了我的部门列表。在 UI 中,我得到了我也想购买的部门列表。这是该部门的第一次采购,因此采购部 BC 尚不知道该部门……因此采购部对象中的采购部对象将填充从另一个 BC 维护的数据 - 那么我该如何坚持呢?如果不存在,我需要添加一些信息,例如送货地址和发票地址?
在“注册部门 UI”中,我是否应该在所有 BC 上调用“RegisterDepartment”服务,然后确保这些与通过 UI(MVC 控制器)所做的所有更改同步?
对员工也是如此。我想知道哪个员工进行了购买或将某些东西放入档案中。因此,不知何故,我也需要这些 BC 中的员工对象,但从不同的 BC 管理它们。
持久
化 上面的一些挑战可以通过将不同的员工对象映射到数据库中的同一个表来解决。Purchasing BC 和 Archive BC 不能注册新员工,但会将信息附加到那里的员工,并将他们与同一数据库中的其他对象联系起来。然后数据库将确保所有 BC 仍然生活在同一个世界中......
我需要建议,所以我最终不会做出以后很难维护的东西。