2010-11-10 22 views

回答

2

大多數時候我儘量分開我的圖層。通常我會將我的服務作爲業務邏輯的外牆。在業務邏輯我使用DI容器,如統一,以解決我的倉庫......

例子:

IUnityContainer container = IoCManager.Container; 
using (var repository = container.Resolve<IRepository<Token>>()) 
{ 
    return repository.Eagerly(f => f.Fetch<TokenSetting>(t => t.Settings)) 
        .Where(t => t.Value == tokenGuid && t.Expired == null) 
        .FirstOrDefault(); 
} 

我的商業邏輯現在包括我的基礎設施層(庫)上沒有依賴關係。對於一個偉大的Repository實現來看看NCommon。 Ritesh Rao爲DDD寫了一些很好的模式使用例子。

引用您的存儲庫是否是錯誤的是主觀的。我認爲DDD純粹主義者會告訴你它很可能是。 「你試圖達到多少SoC」是真正的問題。通常最好是通過鬆散耦合來爭取高內聚力,但有時候這可能是過度的。

希望這會有所幫助。


[EDITED]

存儲庫可以在域中存在。真的,他們坐在你的業務邏輯/模型和你的基礎設施模型之間。你是正確的依靠接口而不是實現。

看看馬丁福勒的 - Separated Interface Pattern。在我上面的例子中,我依賴於接口。 DI容器解析了我的具體存儲庫類的實際實現。這裏是我學習的一些樣本DDD圖。 alt text

+0

好的謝謝。但是存儲庫接口是域層的一部分 - 這意味着如果您使用DI並且只依賴於接口而不是實現,則可以在域層(也就是域服務)中使用存儲庫,那麼應該可以嗎? – 2010-11-10 20:10:27

+0

你在那裏完全正確。我編輯了我的原始文章以包含更多詳細信息。您的存儲庫可以位於域內。要了解的重要一點是它們的功能,它可以調解業務和數據訪問層之間的通信。 – Daniel 2010-11-10 20:30:19

+0

服務定位器是一種反模式:http://blog.ploeh.dk/2010/02/03/ServiceLocatorIsAnAntiPattern.aspx – 2010-11-11 16:42:06

相關問題