我有一個小項目,我正在運行MVC3。 我使用LINQ從數據庫中獲取數據。 我使用與MVC3附帶的預製示例相同的架構設計構建了我的項目。 在這樣的項目中,應用程序被分割,在這個主題中,我想關注Model.cs文件。目前,我對每個控制器都有一個,所以作爲一個例子,我有一個HighscoreController.cs和一個HighscoreModels.cs。在模型類中,我定義了一個Service類,該類引用了datacontext以及一些使用此datacontext查詢數據庫的方法。 現在我遇到了這些方法中的一些正在執行相同查詢的問題,因此我想讓訪問數據庫的中心點,所以我想我會實現存儲庫模式,所以我做了。 因此,而不是在服務類具有一個DataContext的引用我現在有這樣的資源庫的引用:MVC,存儲庫模式和DataLoadOptions
private IRepository _repository;
public HighscoreService()
: this(new Repository())
{ }
public HighscoreService(IRepository repository)
{
_repository = repository;
}
現在數據庫中調用存儲庫中進行處理和存儲庫從服務類中使用通過_repository參考。
我的倉庫是建立這樣的:
public class Repository : IRepository
{
private MyDataContext _dataContext;
public Repository()
{
_dataContext = new MyDataContext();
}
public Member MemberByName(string memberName)
{
Member member = CompiledQueries.MemberByName(_dataContext, memberName);
return member;
}
}
當我嘗試結合使用DataLoadOptions這個倉庫模式我所面臨的問題出現。
因爲當您使用dataloadoptions時,在應用新的dataloadoptions之前,您一定沒有對datacontext進行過查詢。由於我的存儲庫在所有方法中都重用了數據上下文,這根本不起作用。 我一直在嘗試2件事,一種是通過using語句重新創建每個方法中的datacontext,以確保每次刷新datacontext。但是,當我從存儲庫中取回結果返回到我的模型中並且範圍在存儲庫模式內部運行時,隨着using語句結束,我遇到了問題,這意味着結果不能用於例如。 .Count()或.ToList()是因爲爲我提供數據的datacontext已終止。我還嘗試了另一種解決方案,它在整個存儲庫中使用相同的datacontext,但在每個使用dataloadoptions的方法中創建一個新實例。這感覺非常骯髒;) 所以任何人都可以給我一個關於如何使用DataLoadOptions與存儲庫模式的建議?並避免我剛剛描述的問題。或者我應該不使用dataloadoptions並選擇另一種方式來做到這一點?我使用DataLoadOptions的原因是我想從相關表中獲取一些數據。
作爲一個小問題:在上面的代碼示例中,您可以看到我已將CompiledQueries放入自己的.cs文件中。這是一個糟糕的設計?在MVC應用程序中將編譯查詢放在哪裏有任何指導原則嗎?
感謝您的閱讀並希望我的問題有一些答案;)提前致謝。如果您需要更多信息,只需詢問。
我不是專家,但我認爲將數據上下文保留在「請求範圍」中的想法可能有所幫助。這樣,每個HTTP請求都會創建一個新的上下文,這可能會消除您的一些問題。像Ninject這樣的IoC容器可以幫助解決這個問題。雖然它涉及實體框架,但以下文章可能會有所幫助:http://buildstarted.com/2010/08/24/dependency-injection-with-ninject-moq-and-unit-testing/ – ngm 2012-04-09 13:13:22
注入您的存儲庫並進行設置按照WebRequest的生活方式。目前還不確定存儲庫爲您做了什麼,除了添加無用的抽象層。 – CrazyCoderz 2012-04-09 20:45:00