DDD 聚合上的多态性
Polymorphism on DDD aggregates
我正在设计我的域模型,但无法理解如何搜索具有相同 ID 的类似聚合。
假设我们有两个聚合 ActiveEmployee 和 InactiveEmployee。它们在结构上有很多差异,但也有一些共性,因为它们都是 Employees 并且都有一个 employeeId。
他们每个人都有一个带有 findById 的单独存储库,在某些情况下我需要单独检索它们,但在某些情况下我需要搜索一个员工,然后查看我得到的员工是活跃的还是不活跃的。
我首先想到的是让一些抽象的 class 员工拥有自己的存储库来进行搜索,但据我所知,聚合不应使用这种类型的多态性。
通过拥有两个单独的存储库,我需要在需要普通员工时检查这两个存储库,并处理我在一个或两个存储库中找不到任何存储库的情况。
在这种情况下是否可以使用一些最佳实践?
编辑:
我意识到上述情况可能无法完全表达我的问题,所以让我们试试这个:
我有两种类型的包,无法更改的 ProvidedPackage 和用户创建和更改的 UserPackage。
两者都包含模块,用户从几个不同的 ProvidedPackages 和其他 UserPackages 中选择需要的模块来创建一个新的组合包。各个模块的源码包也存放在新的UserPackage中,方便跟踪。
ProvidedPackages 包含一些关于如何使用 UserPackage 没有的特定实例模块的规则。并且 UserPackage 有一个 ProvidedPackage 没有的 approval 字段。 (它们之间还有其他区别)。
创建新包时,用户从两种包类型中添加模块,而不关心它是 ProvidedPackage 还是 UserPackage。
我解决这个问题的想法是有两个独立的聚合,因为不变量有很多差异。 “PackageID”用作两种类型的标识。感觉就像父 class“包”对于我需要使用 PackageID 列表检索包的情况很有用。否则我总是需要每次都检查两个存储库。如果将来添加包类型,则需要添加更多检查。
在活跃和不活跃员工的具体情况下,我真的不认为他们应该被视为不同的集合:毕竟每个员工都会在某个时候变得不活跃。通过将它们建模为单独的聚合,严格来说,您将失去确保给定 ID 不会同时处于活动和非活动状态的能力。
活跃和不活跃员工的状态模型非常不同,这表明这些聚合体大多存在于不同的有界上下文中。您将有一个 Employment 有界上下文,它负责分配 ID 并跟踪员工是活跃还是不活跃(这可以通过 employeeStarted
和可选的 employeeFinished
字段)以及模型的其他常见方面。在只与活跃员工打交道的情况下(例如 Payroll),您有一个终止雇佣的命令(这可能反过来从该有界上下文的存储库中删除)。
我正在设计我的域模型,但无法理解如何搜索具有相同 ID 的类似聚合。
假设我们有两个聚合 ActiveEmployee 和 InactiveEmployee。它们在结构上有很多差异,但也有一些共性,因为它们都是 Employees 并且都有一个 employeeId。
他们每个人都有一个带有 findById 的单独存储库,在某些情况下我需要单独检索它们,但在某些情况下我需要搜索一个员工,然后查看我得到的员工是活跃的还是不活跃的。
我首先想到的是让一些抽象的 class 员工拥有自己的存储库来进行搜索,但据我所知,聚合不应使用这种类型的多态性。 通过拥有两个单独的存储库,我需要在需要普通员工时检查这两个存储库,并处理我在一个或两个存储库中找不到任何存储库的情况。
在这种情况下是否可以使用一些最佳实践?
编辑:
我意识到上述情况可能无法完全表达我的问题,所以让我们试试这个:
我有两种类型的包,无法更改的 ProvidedPackage 和用户创建和更改的 UserPackage。
两者都包含模块,用户从几个不同的 ProvidedPackages 和其他 UserPackages 中选择需要的模块来创建一个新的组合包。各个模块的源码包也存放在新的UserPackage中,方便跟踪。
ProvidedPackages 包含一些关于如何使用 UserPackage 没有的特定实例模块的规则。并且 UserPackage 有一个 ProvidedPackage 没有的 approval 字段。 (它们之间还有其他区别)。
创建新包时,用户从两种包类型中添加模块,而不关心它是 ProvidedPackage 还是 UserPackage。
我解决这个问题的想法是有两个独立的聚合,因为不变量有很多差异。 “PackageID”用作两种类型的标识。感觉就像父 class“包”对于我需要使用 PackageID 列表检索包的情况很有用。否则我总是需要每次都检查两个存储库。如果将来添加包类型,则需要添加更多检查。
在活跃和不活跃员工的具体情况下,我真的不认为他们应该被视为不同的集合:毕竟每个员工都会在某个时候变得不活跃。通过将它们建模为单独的聚合,严格来说,您将失去确保给定 ID 不会同时处于活动和非活动状态的能力。
活跃和不活跃员工的状态模型非常不同,这表明这些聚合体大多存在于不同的有界上下文中。您将有一个 Employment 有界上下文,它负责分配 ID 并跟踪员工是活跃还是不活跃(这可以通过 employeeStarted
和可选的 employeeFinished
字段)以及模型的其他常见方面。在只与活跃员工打交道的情况下(例如 Payroll),您有一个终止雇佣的命令(这可能反过来从该有界上下文的存储库中删除)。