[英]DDD persisting aggregate on 2 different databases
我有一个通用IRepository<T>
,它在Infrastructure.NHibernate
下实现,使用Simple Injector
将实现注入到接口中。 IRepository<T>
在我的Domain
以便域对象可以使用注入的存储库。
我有一个User``AggregateRoot
,它在应用程序数据库Id
, Firstname
, Lastname
包含有关用户的一些详细信息。 我知道不关心持久性,但是在此阶段,我们正在讨论如何持久化这些对象。
在我Web.UI
(ASP.Net MVC 5)我有一个屏幕,在这里我可以更新用户的详细信息, Firstname
, Lastname
, Email
, Address
。 ID已存储,但无法更新。
更新User
详细信息时,我使用IRepository<User>
更新Firstname
和Lastname
。
问题:我也需要在我们的OpenLdap
服务器中更新Firstname
, Lastname
, Email
, Address
。
我有一个Infrastructure.Ldap
项目,所有Ldap实现都位于其中。 (存储库,服务,实体,助手,转换器)。
更新LDap服务器的最佳方法是什么?
是否在Infrastructure.Ldap
实现的Domain
创建另一个ISomeRepository
接口? 这意味着我需要向User
添加其他属性,并且只需覆盖ORM映射即可忽略其他属性。 然后,我使用IRepository
,然后使用ISomeRepository
更新两个数据库中的用户。
要么
Web.UI已经是基础结构方面的问题,因此我仅引用Infrastructure.Ldap
项目并直接与ldap存储库进行交谈,该存储库将与LDapUser
对象一起使用。 这将使我可以分别更新Ldap上的User。
我很困惑,业务规则是我们需要更新用户详细信息。 从DDD的角度来看,我认为所有需要更新的细节都必须存在于域中。 如何在2个不同的数据存储区上保留该User
?
我上面的选择之一是否有效并通过了良好实践,还是有其他解决方案? 业务需要有2个不同的数据存储,因此我需要进行这项工作。
Id
, Firstname
, Lastname
-如果Ldap发生故障,它存储在应用程序数据库中,以后将用于审核目的。
Id
, Firstname
, Lastname
, Email
, Address
-存储在用户管理的OpenLdap
服务器中。
有人能指出我正确的方向吗? 严格地从DDD角度考虑这种情况真的很困难,因为他限制了需要在哪里发生持久性。 如果全部在应用程序数据库上,那将很容易。
您可以在存储库中使用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
时不必更改它们。 我们还通过这种方式解决了这个问题,取得了很好的副作用-存储库中的“ Single Responsibility
原则”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.