如果我有以下存储库:
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??)
}
}
如果是这种情况,我还需要让我的存储库实现 IDisposable 吗?
Visual Studio Code Metrics 当然认为我应该这样做。
我使用 IQueryable 是因为我将查询控制权交给了我的服务层(过滤器、分页等),所以请不要就我使用它的事实进行架构讨论。
顺便说一句 - SqlDataContext是我的自定义类,它扩展了实体框架的 ObjectContext 类(所以我可以有 POCO 方)。
所以问题 - 我真的必须实施 IDisposable 吗?
如果是这样,我不知道这是怎么可能的,因为每个方法共享相同的存储库实例。
编辑
我正在使用依赖注入(StructureMap)将具体存储库注入服务层。这种模式沿应用程序堆栈向下 - 我正在使用 ASP.NET MVC,并将具体服务注入到控制器中。
换句话说:
- 用户请求网址
- 控制器实例被创建,它接收一个新的 ServiceLayer 实例,该实例是用一个新的 Repository 实例创建的。
- 控制器调用服务上的方法(所有调用都使用相同的存储库实例)
- 一旦请求得到服务,控制器就消失了。
我正在使用混合模式将依赖项注入到我的控制器中,根据 StructureMap 文档,这会导致实例存储在 HttpContext.Current.Items 中。
所以,我不能这样做:
using (var repo = new Repository())
{
return repo.Users().ToList();
}
因为这破坏了 DI 的全部意义。