2011-10-09 32 views
1

我有以下的倉儲類:是否正確的ASP.NET MVC&EF應用程序的體系結構?

public class Model1Repository 
{ 
    private NEOGOV_IdeasEntities _dataContext; 
    public Model1Repository() 
    { 
     _dataContext = new NEOGOV_IdeasEntities(); 
    } 
    public IdeaType IdeaType(int ID) 
    { 
     var q = from i in _dataContext.IdeaTypes where i.ID == ID select i; 
     return q.FirstOrDefault(); 
    } 
    ... rest methods.... 
} 

以下控制器:

public class TestController : Controller 
{ 
    private Model1Repository _repository; 

    public TestController() 
    { 
     _repository = new Model1Repository(); 
    } 
    public ActionResult Tagedit() 
    { 
     return View(_repository.GetDataFromDB1()); 
    } 

    public ActionResult Avatar() 
    { 
     return View(_repository.GetDataFromDB2()); 
    } 
} 

是正確的體系結構?或不?據我所知,在我的情況下_repository變量爲每個請求創建...

+0

它工作嗎?是。好嗎?不可以。您應該使用依賴注入:)使用Ninject查看依賴注入。這很容易建立。 – Dismissile

回答

1

個人而言,我會實例化控制器操作中的存儲庫,而不是構造函數。如果您確信所有控制器操作都需要存儲庫,那麼就足夠公平了,但由於控制器上的操作與UI的操作相關,因此擁有不需要的控制器方法並不罕見。但是,它在一天結束時確實是一種風格的事情(好吧,也許有一些小的性能開銷);如果你想這樣做,請隨意!

+0

你寫下關於_repository的單例。這說得通? –

+0

在你的實現中,_repository不是單例,這很好。爲了利用連接池,您需要快速釋放數據上下文。事實上你的_repository將在控制器動作後被垃圾收集,這將有助於這種情況發生,而使用單例模式則不會。但是,如果在需要時創建存儲庫並儘快發佈,則可以進一步提高效率並提高可伸縮性。 –

-2

不能回答整個架構,但將有一個和唯一一個存儲庫Model1Repository對象爲TestController實例化,而不是一個請求(HTTP請求)。

+1

爲什麼一個?調試器說,控制器的構造函數調用每個請求。 Ctor創建Model1Repository的新副本,Model1Repository的創建者創建NEOGOV_IdeasEntities的新副本。因此,每個請求都會創建NEOGOV_IdeasEntities的新副本.... –

+2

控制器的默認生命週期是每個請求,並且由於_repository不是單身,每次都會創建一個新的。 –