2012-02-22 35 views
3

通過MVC + EF闖入並試圖專注於以正確的方式做事。現在我正在尋找添加下拉到表單,但我想避免每次頁面加載時擊中數據庫,所以我想將數據存儲在應用程序級別。我想創建一個應用程序級變量不是最好的方法。我已經閱讀過有關使用緩存和靜態實用程序的功能,但令人驚訝的是,沒有任何聲音非常明確。 (靜態類不好的單元測試,緩存壞在MVC中保持數據庫存儲的查找數據在應用程序級別的最佳實踐

所以,我有兩個場景,我很好奇,我不知道,如果方法將兩種。

1之間的差異)的基本查詢,讓我們說五十個州。小,定義,永遠不會改變。在應用程序啓動時加載(不尋找一個硬編碼的解決方案,但從數據庫中檢索)

2)一個查詢,將很少改變,只有通過類似管理員的屏幕。比方說,您的產品正在出售的城市/商店。因此數據將被存儲在模型中 ,但是除非有人通過應用程序進行更改,否則數據將相對靜態。因此,每次我需要填充下拉列表框時,都不打算訪問數據庫。

好像基本的東西,但它基本上是相同的,因爲這話題,從未回答:

Is it good to use a static EF object context in an MVC application for better perf?

任何幫助表示讚賞。

回答

2

我會在幾個地方解決你的問題。首先,在MVC中使用靜態變量或緩存模式本質上是不好的。答案根本不是。只要你的架構支持它們就沒問題。只需將您的緩存放在正確的位置並進行可測試性設計,我將在稍後解釋。

第二部分是什麼是「正確」的方式來存儲這種類型的持久數據,因此您不必循環訪問數據庫來填充常見的UI項目。爲此,我不建議存儲EF對象。我會創建您緩存的POCO對象(查看模型或類似)。因此,在您50個州的例子,你可能有這樣的事情:

public class State 
{ 
    public string Abbreviation { get; set; } 

    public string Name { get; set; } 
} 

,那麼你會做這樣的事情來創建緩存列表:

List<State> states = Context.StateData.Select(s => new State { Abbreviation = s.Abbreviation, Name = s.Name}).ToList(); 

最後,無論你的緩存解決方案,它應該實現一個接口,以便您可以嘲笑該緩存方法進行測試。

要做到這一點,而不會在循環引用,或使用反射,則需要至少3個組件:

你的MVC應用程序 類庫來定義你的POCO對象和接口 類庫不執行數據訪問和緩存(這顯然可以分成2個庫,如果這使得它更易於維護和/或測試)

這樣,你可能有這樣的事情在你的MVC代碼:

ICache myCache = CacheFactory.CreateCache(); 
List<State> states = myCache.ListStates(); 
// populate your view model with states 

ICache和狀態位於一個庫中,而您的ICache的實際實現位於另一個庫中。

這就是我爲我的標準架構所做的:將數據訪問不可知的POCO對象和接口分離爲獨立於數據訪問的獨立庫,這與我的MVC應用程序是分開的。

+0

從技術上講,您可以將您的POCO類作爲您的數據訪問層中緩存機制的接口。然後,你可以在你的MVC應用中實現緩存並實現接口並將它傳遞到數據訪問層,如下所示:dataLayer.LoadStates(myCache)其中ICache將公開一個屬性或方法,讓你填充狀態列表。 – 2012-02-23 02:23:06

0

使用諸如unity,ninject,structuremap等的依賴注入工具進行研究。這些將允許您通過實現一個內核來保持對象的應用程序級別控制,該內核與您的內容非常類似似乎在描述。

+0

我在我的項目中使用Ninject。但我不認爲DI與應用程序級別的緩存數據有關。我錯了嗎? – 2012-02-23 14:00:57

相關問題