2012-01-26 65 views
0

在存儲庫示例中,我看到存儲庫在會話打開時實例化,這看起來好像是整個會話一樣。在控制器操作中,通過調用存儲庫訪問數據層。這是常見的做法嗎?根據每個操作請求在需求基礎上實例化存儲庫是否更有意義?在全球範圍內舉辦資料庫是否常見?

編輯:一個更確切的場景。

public class myController : Controller { 
    IMyRepository myRepository; 

    public myController(IMyRepository repositoryParam){ 
    myRepository = repositoryParam; 
    } 

    public ActionResult someAction(){ 
    MyClass myClass = myRepository.RepositoryAction(); 
    } 
} 

在這種情況下,myRepository對myController是全局的(注意:這是基於Steven Sanderson的一個例子)。我已經看到它也定義了所有的控制器可以訪問,但這是一個簡單的,確切的例子。在這個例子中,爲什麼版本庫會在全局使用,而不是基於每次使用?

+0

存儲庫是一個相當寬泛的概念。您必須以更具體的方式定義您的確切場景,以便從您的問題中瞭解一些情況。 – 2012-01-26 23:32:50

+0

@DarinDimitrov用更精確的場景進行編輯。 – 2012-01-26 23:43:21

+0

@DarinDimitrov - 我假設他指的是許多ASP.NET MVC示例(使用存儲庫模式訪問數據層)中顯示的存儲庫。通常在這些示例中,具體的存儲庫對象正在通過EF訪問數據庫。 – JasCav 2012-01-26 23:48:48

回答

2

要回答你的問題,特拉維斯,你應該讀一下Repository Pattern。這種模式用於提供許多優點,包括:

  • 它集中了數據邏輯或Web服務訪問邏輯。
  • 它爲單元測試提供了一個替代點。
  • 它提供了一個靈活的架構,可隨着應用程序整體設計的發展而進行調整。

至於你的問題:「這是常見的做法?」答案是,「應該是。」但是,不幸的是,我沒有看到我想要的那麼多。

現在,在您的示例中,您將顯示在控制器類的上下文中創建的存儲庫。 (請注意,這與放置它的「全局」對象不同,全球意味着該對象可從任何示波器訪問。)

無論如何其中一個優點是,通過使用正確的具體版本的存儲庫,存儲庫允許您在如何訪問數據(甚至是訪問數據的位置)之間切換。所以,你可能有:

  • IRepository - 你的接口,具體的存儲庫實現。
  • DatabaseRepository - 訪問數據庫中的數據。
  • FlatFileRepository - 從平面文件中訪問您的數據。

如果你想切換到其他數據源,這是一個簡單的在你的控制器換出的具體實施。 (請注意,通過dependency injection有更高級和更靈活的方法,但這不在此問題的範圍內,儘管它可以/可以在存儲庫模式中大量播放。)

無論如何,項目團隊決定「嘿,我們將從將所有數據存儲在平面文件中轉換爲使用數據庫。」那麼,如果你已經在整個代碼中分散了這個特定版本庫的實例,那麼現在有很多不同的地方需要修復和更新,這有些否定了版本庫模式的優點。但是,通過聲明控制器的成員存儲庫,您只需從FlatFileRepository切換到DatabaseRepository,實施新的存儲庫,即可完成!團隊中的每個人都很開心!

更新:「爲什麼實例化類變量?」

要回答這個問題,你必須考慮你的兩個選擇。第一個選擇是你可以在內存中放置一個相對較小的對象。另一種方法是每當用戶需要訪問您的某個操作時導致新內存被分配(並在您離開對象所在的範圍時解除分配)並且需要更多的工作時,您可以在內存中實例化一個新對象服務器託管您的Web應用程序。

如果您考慮如何使用網站,用戶會頻繁觸碰這些操作。每個動作都代表您網站的一部分。如果您每次需要存儲庫時都實例化,那麼您會很快給服務器一個比實際需要更大的工作量 - 特別是當您的網站規模增大時。 (我相信其他人可以考慮其他原因,爲什麼你會按照教程中所示的方式與每個單獨操作中的實例化進行比較。)

然後,當然,存在重構問題:我上面提到過。這是關於「進行改變的效率」或改進可維護性。

希望能幫助你更多更好地回答你的問題!

+0

謝謝你的深入解答。我意識到,在我給出的簡單示例中,存儲庫正在控制器的上下文中使用。但是,我已經看到它們在global.asax的ApplicationStart部分中使用。回到關鍵問題,我的主要問題是要理解爲什麼整個存儲庫即使在此控制器中持續這麼久?對於我來說,即使它保存了幾行代碼,並且更容易更改數據層連接,也不會對整個生命週期(在本例中爲控制器)的存儲庫保持高效。 – 2012-01-27 00:09:46

+0

來自我對存儲庫模式所做的所有閱讀,在我看來,它總是被緩存超出一個請求。這似乎不是最佳實踐。 – 2012-01-27 00:14:49

+0

@TravisJ - 做了更新。希望這有助於更好地回答你的問題。 – JasCav 2012-01-27 00:17:12