[英]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.