2011-07-20 35 views
1

我創建了一個簡單的存儲庫類,它是返回項目的列表使用說明:實體框架 - 瓦特/庫中存儲的延遲執行

public class ProjectRepository : IProjectRepository 
{ 
    public IQueryable<Project> GetProjects() 
    { 
     DbEntities db = new DbEntities(); 

     return db.Projects; 
    } 
} 

我有一些代碼後上下行正在關閉此IQueryable的做一些排序/分頁:在using語句是出於習慣

public ActionResult Index() 
{ 
    var projectList = (from p in projectRepository.GetProjects() 
         orderby p.Name 
         select p).Take(20); 

    return View(projectList.ToList()); 
} 

我原本包裹着我的GetProjects()調用 - 因爲它通常是爲儘快處理你的對象是個好主意。這引起了一些可以理解的問題,因爲我在控制器操作中做了一些更多的數據庫工作

只是讓對象在垃圾收集器中處理時可以嗎?有沒有更好的方法來做到這一點?我應該創建更有針對性庫的方法,如:

public IQueryable<Project> GetProjects(int takeThisMany) 
{ 
    return (from p in db.Projects 
      orderby p.Name 
      select p).Take(takeThisMany); 
} 

這是一個好的或不好的做法,返回將在稍後的時間在一個控制器動作執行IQueryable的對象不設置原始上下文或沒有?

回答

2

可以返回IQueryable<T>,但要麼不處置ObjectContext(應該始終處理任何IDisposable)或在請求完成之前處置它。

Use constructor injection to pass the context to the repository and dispose it at the end of the request.

+0

似乎是一種很好的方法。我還沒有真正做過很多DI ......需要決定使用哪個庫。對於從未真正做過DI的人,你會推薦什麼? – Dismissile

+0

我推薦Mark Seeman的書「.NET中的依賴注入」。也就是說,任何具有MVC支持的DI框架都將很容易使用。你不能犯太多錯誤。 –

+0

因此,當你在上下文中進行構造函數注入傳遞時,你的存儲庫將在本地範圍內定義爲你有更多可能的操作方法?在我將庫作爲Controller的實例變量之前,但是如果我在調用某個操作後需要處理,我認爲這不會起作用。 – Dismissile