簡體   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