DDD在两个不同的数据库上持久聚合

时间:2015-09-07 04:31:13

标签: design-patterns architecture fluent-nhibernate domain-driven-design onion-architecture

我有一个Generic IRepository<T>,它在Infrastructure.NHibernate下实现,使用Simple Injector将实现注入接口。 IRepository<T>生活在我的Domain中,以便域对象可以使用注入的存储库。

我有一个User``AggregateRoot,其中包含有关应用程序数据库中用户的一些详细信息,IdFirstnameLastname。我知道不要关心持久性,但是我们现在讨论的是这些对象是如何持久化的。

在我的Web.UI(ASP.Net MVC 5)中,我有一个屏幕,我可以在其中更新用户详细信息,FirstnameLastnameEmail,{{1 }}。 ID已存储但无法更新。

当我更新Address详细信息时,我使用User更新IRepository<User>Firstname

问题:我还需要更新Lastname服务器中的FirstnameLastnameEmailAddress

我有一个OpenLdap项目,其中包含所有Ldap实现等。 (存储库,服务,实体,帮助者,转换器)。

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

我是否在Infrastructure.LdapISomeRepository实现了另一个Domain接口?这意味着我需要向Infrastructure.Ldap添加其他属性,并覆盖ORM映射以忽略其他属性。然后,我使用User,然后使用IRepository更新两个数据库中的用户。

Web.UI已经是一个基础架构问题,因此我只引用ISomeRepository项目并直接与ldap存储库对话,该存储库将与Infrastructure.Ldap对象一起使用。这将让我分别在Ldap上更新用户。

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

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

UserIdFirstname - 如果Ldap关闭,它将存储在应用程序数据库中,稍后将用于审核目的。

LastnameIdFirstnameLastnameEmail - 这存储在用户管理的Address服务器部分。

有人可以请我指出正确的方向。由于他对持久性需要发生的限制,很难从DDD角度严格考虑这种情况。如果它全部在应用程序数据库上,那将很容易。

1 个答案:

答案 0 :(得分:4)

您可以在存储库中使用json = params["Comment"] newArray = [] json.split(" ").each do |element| if element.length > 1 newArray << element end end 设计模式:

Composite

我们假设存在public IRepository<T> { void Save(T entity); } public class CompositeRepository<T> : IRepository<T> { private readonly IEnumerable<IRepository<T>> repositories; public CompositeRepository(IEnumerable<IRepository<T>> repositories) { if(repositories == null) { throw new ArgumentNullException("repositories"); } this.repository = repositories; } public void Save(T entity) { foreach(var repository in repositories) { repository.Save(entity); } } } SqlUserRepository,并且两者都实现了LdapUserRepository。然后,您可以使用容器注册IRepository<User>

CompositeUserRepository

由于您的服务进一步使用了container.RegisterCollection<IRepository<User>>(new[] { typeof(SqlUserRepository), typeof(LdapUserRepository) }); container.Register<IRepository<User>, CompositeRepository<User>>(); ,因此在向IRepository<User>添加持久性User时无需更改。我们也通过这种方式实现了很好的副作用,在存储库的上下文中解决了这个问题 - LDAP原则。