繁体   English   中英

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

[英]DDD persisting aggregate on 2 different databases

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

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

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

更新User详细信息时,我使用IRepository<User>更新FirstnameLastname

问题:我也需要在我们的OpenLdap服务器中更新FirstnameLastnameEmailAddress

我有一个Infrastructure.Ldap项目,所有Ldap实现都位于其中。 (存储库,服务,实体,助手,转换器)。

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

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

要么

Web.UI已经是基础结构方面的问题,因此我仅引用Infrastructure.Ldap项目并直接与ldap存储库进行交谈,该存储库将与LDapUser对象一起使用。 这将使我可以分别更新Ldap上的User。

我很困惑,业务规则是我们需要更新用户详细信息。 从DDD的角度来看,我认为所有需要更新的细节都必须存在于域中。 如何在2个不同的数据存储区上保留该User

我上面的选择之一是否有效并通过了良好实践,还是有其他解决方案? 业务需要有2个不同的数据存储,因此我需要进行这项工作。

IdFirstnameLastname -如果Ldap发生故障,它存储在应用程序数据库中,以后将用于审核目的。

IdFirstnameLastnameEmailAddress -存储在用户管理的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);
        }
    }
}

假设存在SqlUserRepositoryLdapUserRepository并且都实现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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM