Domain driven design 领域驱动的设计实现聚合

Domain driven design 领域驱动的设计实现聚合,domain-driven-design,aggregate,Domain Driven Design,Aggregate,我已经阅读了有关创建聚合和职责的内容,我怀疑如何正确地实施它们。假设我们有上下文,其中有2个实体。一个是公司,另一个是用户。业务规则位于公司实体中,这意味着它应该成为聚合根。对于该公司,我们只能分配3个用户,当Comapny的状态为“已阻止”时,我们不能分配用户。用户还可以使用emial和密码登录。考虑到这一点,用户实体上的每个操作都应该通过聚合根调用,并且用户不应该拥有自己的存储库。当我们没有公司根目录无法直接登录时,如何对用户进行登录操作?我们不能从聚合中调用用户。如何找到提供电子邮件和密码

我已经阅读了有关创建聚合和职责的内容,我怀疑如何正确地实施它们。假设我们有上下文,其中有2个实体。一个是公司,另一个是用户。业务规则位于公司实体中,这意味着它应该成为聚合根。对于该公司,我们只能分配3个用户,当Comapny的状态为“已阻止”时,我们不能分配用户。用户还可以使用emial和密码登录。考虑到这一点,用户实体上的每个操作都应该通过聚合根调用,并且用户不应该拥有自己的存储库。当我们没有公司根目录无法直接登录时,如何对用户进行登录操作?我们不能从聚合中调用用户。如何找到提供电子邮件和密码的用户?获取所有聚合并迭代用户是低效的,我认为这不是一个好主意。
谢谢你的帮助

我认为该用户应该属于另一个BC(管理身份验证和授权)。在您的公司BC中,您必须从身份验证和授权BC获取用户。您必须使用上下文映射模式集成这两个BC,其中身份验证和授权BC位于上游,公司BC位于下游。

我认为用户应该属于另一个BC(管理身份验证和授权)。在您的公司BC中,您必须从身份验证和授权BC获取用户。您必须使用上下文映射模式集成这两个BC,其中身份验证和授权BC在上游,公司BC在下游。

身份验证通常不是域的一部分(在99%的所有用例中),只是基础结构的一部分

因此,
用户
不应该出现在有限制的上下文中。在真实的商业世界中,也没有用户,只有人、人、员工、经理或联系人等

因此,对于日志记录问题,您可以使用用户名+密码作为身份验证的用户。这些用户有一个id(数字、字符串或guid)

您的
员工
人员
实体/聚合(或您根据您的领域对其进行的命名,确切的术语取决于公司-普遍存在的语言),然后仅包含属于该人员的数据(但不包括相关信息的标识)

然后,您可以将员工连接到用户(通过将员工id设置为用于登录的用户id、一个额外字段或通过1:1或1:n查找表)


通过这种方式,您可以轻松地删除用户(登录名),而无需删除
员工
实体,因为在现实世界中,您无法轻松地删除业务数据(即,假设删除一个用户会删除每个发票或CRM数据上的收件人,没有人知道此人过去曾在那里工作过).

身份验证通常不是域的一部分(在99%的所有用例中),只是基础结构的一部分

因此,
用户
不应该出现在有限的上下文中。在真实的商业世界中,也没有用户,只有人、个人、员工、经理或联系人等

因此,对于日志记录问题,您可以使用用户名+密码作为身份验证的用户。这些用户具有id(数字、字符串或guid)

您的
员工
人员
实体/聚合(或您根据您的领域对其进行的命名,确切的术语取决于公司-普遍存在的语言),然后仅包含属于该人员的数据(但不包括相关信息的标识)

然后,您可以将员工连接到用户(通过将员工id设置为用于登录的用户id、一个额外字段或通过1:1或1:n查找表)


通过这种方式,您可以轻松地删除用户(登录名),而无需删除
员工
实体,因为在现实世界中,您无法轻松地删除业务数据(即,假设删除一个用户会删除每个发票或CRM数据上的收件人,没有人知道此人过去曾在那里工作过).

我已将公司和用户设置为公共BC(标识),因为这两个实体都有很强的连接。在注册过程中,我与用户(所有者)创建了公司因此,最好的解决方案是在公司聚合中创建工厂方法,以避免不一致。如果公司和用户是分开的BC,那么我应该抛出业务事件并在用户BC中处理它吗?我的答案类似于@Tseng。在公司BC(C-BC)中,您应该有所有者和员工。在身份验证和授权BC(AA-BC)中您有用户和角色。上下文映射由您决定。您可以使用异步方法(事件)或同步(AA-BC中的rest api)实现它。正如Tseng所说,从C-BC的角度来看,身份验证和授权管理是基础结构。它是应用程序服务中的一个接口,在基础结构中实现,并且在这个实现中与AA-BC对话。感谢您的帮助。非常感谢我按照您的建议建模了2个BC,但我仍然想知道如何建模通信tween BC。例如,注册是一个涉及两个上下文的过程。有一个REST请求-api/Registration/company,涉及2个业务操作。一个是在C-BC上下文中的CompanyAggregate上创建方法。之后,我可以触发事件,该事件将在AA-BC中处理,以创建具有提供电子邮件和密码的用户。如果有fire first事件后应用程序会崩溃吗?会有不一致。可能注册应该是简单的crud操作,因为这里没有业务逻辑,通信是另一种方式,AA-BC是上游,C-BC是下游。如果您将两者与事件集成,上游发布事件,下游侦听事件。AA-BC管理这就是沃恩·弗农所说的“身份和访问上下文”