2011-07-20 36 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