Design patterns DDD在2个不同的数据库上持久聚合

Design patterns DDD在2个不同的数据库上持久聚合,design-patterns,architecture,fluent-nhibernate,domain-driven-design,onion-architecture,Design Patterns,Architecture,Fluent Nhibernate,Domain Driven Design,Onion Architecture,我有一个通用的IRepository,它在Infrastructure.NHibernate下实现,使用简单的注入器将实现注入接口。IRepository位于我的域中,因此域对象可以使用注入的存储库 我有一个用户``AggregateRoot,它在应用程序数据库中保存有关该用户的一些详细信息,Id、Firstname、Lastname。我知道不必关心持久性,但在这个阶段,我们将讨论如何持久化这些对象 在我的Web.UIASP.Net MVC 5中,我有一个屏幕,可以在其中更新用户详细信息、名字、

我有一个通用的IRepository,它在Infrastructure.NHibernate下实现,使用简单的注入器将实现注入接口。IRepository位于我的域中,因此域对象可以使用注入的存储库

我有一个用户``AggregateRoot,它在应用程序数据库中保存有关该用户的一些详细信息,Id、Firstname、Lastname。我知道不必关心持久性,但在这个阶段,我们将讨论如何持久化这些对象

在我的Web.UIASP.Net MVC 5中,我有一个屏幕,可以在其中更新用户详细信息、名字、姓氏、电子邮件和地址。Id已存储,但无法更新

更新用户详细信息时,我使用IRepository更新Firstname和Lastname

问题:我还需要更新OpenLdap服务器中的名字、姓氏、电子邮件和地址

我有一个Infrastructure.Ldap项目,其中包含所有Ldap实现等。存储库、服务、实体、助手、转换器

更新LDap服务器的最佳方法是什么

我是否在Infrastructure.Ldap实现的域中创建另一个异构存储接口?这意味着我需要向用户添加其他属性,只需覆盖ORM映射以忽略其他属性。然后,我使用IRepository,然后使用异构存储来更新这两个数据库中的用户

UI已经是一个基础架构问题,所以我只需引用infrastructure.Ldap项目,并直接与Ldap存储库对话,后者将使用LDapUser对象。这将允许我分别在Ldap上更新用户

我很困惑,业务规则是我们需要更新用户详细信息。我假设从DDD的角度来看,所有需要更新的细节都需要存在于域中。如何在两个不同的数据存储上持久化此用户

我的上述选择之一是否有效并通过良好实践,或者是否有不同的解决方案?业务需要有2个不同的数据存储,因此我需要使这项工作

Id、Firstname、Lastname—这将存储在应用程序数据库中,以防Ldap宕机,并将在以后用于审核目的

Id、Firstname、Lastname、Email、Address——这些信息存储在用户管理的OpenLdap服务器部分

谁能给我指一下正确的方向吗。由于持久性需要发生在哪里的限制,很难严格从DDD的角度来考虑这种情况。如果全部都在应用程序数据库中,那就很容易了。

您可以在存储库中使用复合设计模式:

公开辩论 { 作废储蓄实体; } 公共类CompositeRepository:IRepository { 私有只读IEnumerable存储库; 公共CompositeRepositoryEnumerable存储库 { ifrepositories==null { 抛出新ArgumentNullExceptionrepositories; } this.repository=存储库; } 公共无效保存实体 { 存储库中的foreachvar存储库 { 存储库。保存实体; } } } 假设存在SqlUserRepository和LdapUserRepository,它们都实现了IRepository。然后,您可以使用容器注册CompositeUserRepository:

container.RegisterCollectionnew[]{typeofSqlUserRepository, TypeOfDapUserRepository}; 容器。登记;
正因为如此,您的服务进一步使用了IRepository,并且当您将持久化用户添加到LDAP时,它们不必更改。我们还通过这种方式解决了这个问题,取得了很好的副作用——存储库环境中的单一责任原则。

如果两种存储机制中的一种没有在一个ACID事务中更新,这有什么关系?是否可以更新数据库,然后引发一个事件,该事件最终将更新LDAP,反之亦然?两者都需要同时更新,它将是应用程序数据库,然后是LDAP。Ldap上的用户可以生活在多个应用程序服务器上。因此,如果他们注销并登录到另一台服务器,则这些详细信息需要被传递,因为在登录时,我们会在身份验证后检查用户详细信息,并使用LdapIf中的内容更新应用程序数据库如果您的存储库抽象是可组合的,您可以使用调用SQL存储库实现和LDAP存储库实现的复合模式。然后在SimpleInjector中,您应该将IRepository注册为SqlUserRepository和LdapUserRepository的组合。我将fluentnhibernate与postgresql一起使用,我的lap是一个自定义服务实现,它也使用存储库。你介意用一个例子给出答案吗?我的存储库被抽象为基础设施。@ArkadiuszK-我做了一些研究,看起来是一个可行的解决方案。如果你能发布一个有点细节的答案,我可以接受 这不是给你的。我们的想法是编写两个IRepository的实现,然后告诉SimpleInjector注册收集,我认为这将一个接一个地调用这两个repo。