public IQueryable<User> Users()
{
var db = new SqlDataContext();
return db.Users;
}
我理解仅当查询被触发时连接才会打开:
public class ServiceLayer
{
public IRepository repo;
public ServiceLayer(IRepository injectedRepo)
{
this.repo = injectedRepo;
}
public List<User> GetUsers()
{
return repo.Users().ToList(); // connection opened, query fired, connection closed. (or is it??)
}
}
如果是这种情况,我是否仍需要让我的 Repository 实现 IDisposable 呢?
Visual Studio 代码指标肯定认为我应该。
我正在使用 IQueryable,因为我将查询控制权交给了我的服务层(过滤、分页等),所以请不要在我使用它的事实上进行架构讨论。
顺便说一句 - SqlDataContext 是我的自定义类,它扩展了 Entity Framework 的 ObjectContext 类(这样我就可以拥有 POCO 对象)。
那么问题来了 - 我真的必须要实现 IDisposable 吗?
如果是这样,我不知道如何做到这一点,因为每个方法共享相同的 repository 实例。
编辑:
我正在使用依赖注入(StructureMap)将具体的 repository 注入到服务层中。这种模式沿着应用程序堆栈进行 - 我正在使用 ASP.NET MVC,具体服务被注入到 Controllers 中。
换句话说:
1. 用户请求 URL。 2. 创建 Controller 实例,接收一个新的 ServiceLayer 实例,该实例使用新的 Repository 实例创建。 3. Controller 调用服务的方法(所有调用都使用相同的 Repository 实例)。 4. 请求完成后,Controller 就消失了。
我正在使用混合模式将依赖项注入到我的 Controllers 中,根据 StructureMap 文档,这会导致实例存储在 HttpContext.Current.Items 中。
因此,我无法这样做:
using (var repo = new Repository())
{
return repo.Users().ToList();
}
由于这将打败依赖注入的初衷。