2012-02-21 14 views
2

我有一個使用Unity進行依賴注入的MVC3項目。試圖提高MVC3 + Unity項目的效率

有一個主要的MVC3項目,位於MVC3和數據層之間的「域」類庫,以及構成數據層的一堆類庫。

(MVC3) - (域) - (數據層)

這是在域類的服務的構造的一個示例:一個控制器被稱爲具有

public DomainModelCacheServices(
    Data.Interface.ICountryRepository countryRepository, 
    Data.Interface.ILanguageRepository languageRepository, 
    Data.Interface.ISocialNetRepository socialNetRepository 
) 

每次DomainModelCacheServices在其構造函數中構造一個新的DomainModelCacheServices對象,並在DomainModelCacheServices的構造函數中加上三個存儲庫類。

我不敢相信這是高效!

更糟的是,類DomainModelCacheServices是一個緩存類。它加載永不改變的數據列表,並將它們保存爲靜態數據。但它仍然需要爲每個參考構建三個存儲庫類。

如果我給DomainModelCacheServices一個singleton的生命週期(永遠),我必須確保它是線程安全的,如果有一天當我得到數百次命中時,將會有很多鎖定。

我可以在構造函數改成這樣:

public DomainModelCacheServices(
     IServiceLocator serviceLocator 
    ) 

我不知道爲什麼,但是這看起來不正確。構造函數變得毫無意義,我必須在領域類中引用Unity,並以某種方式使領域類知道MVC3應用程序擁有的ServiceLocator。也許鬆耦合可能太鬆?

也許構建所有這些類並不像看起來那麼低效,我不應該擔心它?

如果Unity支持「Lazy」構造函數參數,那會更好。但事實並非如此。

那麼,關於如何使MVC3 + Unity項目更高效,特別是在領域模型設計中的任何想法?

感謝您的閱讀!

+0

「如果我給DomainModelCacheServices一個單身人士的生命期(永遠),我必須確保它是線程安全的」如果它是靜態的,你不必這麼做,或者我錯過了某些東西? – Glenn 2012-02-21 11:37:16

+0

@格倫:這些字段是靜態的,而不是類本身。 – jgauffin 2012-02-21 11:49:55

+0

你首先使用的是DomainModelCacheServices?有了這樣的通用名稱和那些構造函數參數,我懷疑它一次試圖做太多事情。 – guillaume31 2012-02-21 13:05:51

回答

0

偉大的推理。

但是,創建對象很便宜。我不會創建一個單例,因爲您已經在靜態字段中緩存所有對象。目前的方法很容易理解。

我對你一個問題:你爲什麼沒有在你的倉庫類緩存

存儲庫負責數據,所有數據處理對其他所有數據都應該是透明的。由於他們負責更新數據源,這也使得一切都變得更加簡單。你如何保持緩存與今天的變化保持同步?通過域名事件?

我會創建一個緩存類,我將用作存儲庫中的私有字段。

+0

感謝您的回覆!我在域級緩存的原因是數據已經應用了一些業務邏輯,所以我緩存的對象不是數據模型,而是域模型。 作爲一個例子(我實際上沒有這樣做)國家: **數據模型成員:CountryId,LongName,Code **和 **域模型成員:CountryId,LongName,TruncatedLongName ** 如果我緩存在data-模型級別,我將不得不爲從域級到數據層的每個調用執行截斷。 – Richard 2012-02-21 13:10:32

+0

DDD存儲庫應該創建域模型,而不是數據模型。 – jgauffin 2012-02-21 13:26:19

1

不應該在域級別定義緩存,而應該在存儲庫實現級別定義緩存(在DAL中)。因此,例如ICountryRepository在DAL中應該有兩個實現:CountryRepositoryChachedCountryRepository。這些應該是有線作爲裝飾在Unity(CountryRepository是在ChachedCountryRepository內)。 CachedCountryRepository將檢查數據是否在緩存中,如果不是,則會將呼叫傳遞到內部CountryRepository

創建對象並不昂貴,因爲正確定義了緩存,所以不會太在意問題。

+0

「我個人不喜歡在我的實體中注入任何東西」 - 但DomainModelCacheServices是服務,而不是實體,對嗎?沒有任何東西告訴我們DomainModelCacheServices處理的緩存與DAL有關。它可能是一些其他類型的緩存。 – guillaume31 2012-02-21 13:02:10

+0

是的,關於域名服務,我已閱讀,以解決問題。我在答案中刪除了這部分。至於「緩存」,它在域中無關,無論它是底層實現。緩存它是對您的域的基礎設施的抽象抽象。 – 2012-02-21 14:03:08

+0

同意。除非DomainModelCacheServices位於應用程序層而不是域層。無論如何,我很想知道該服務真的用於什麼:) – guillaume31 2012-02-21 14:58:43