相关疑难解决方法(0)

带有StructureMap(IoC)的IQueryable存储库 - 我如何实现IDisposable?

如果我有以下存储库:

public IQueryable<User> Users()
{
   var db = new SqlDataContext();
   return db.Users;
}
Run Code Online (Sandbox Code Playgroud)

我知道只有在触发查询时才会打开连接:

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??)
   }
}
Run Code Online (Sandbox Code Playgroud)

如果是这种情况,我还需要使我的Repository实现IDisposable吗?

Visual Studio Code Metrics当然认为我应该.

我正在使用IQueryable因为我将查询控制到我的服务层(过滤器,分页等),所以请不要就我使用它的事实进行架构讨论.

BTW - SqlDataContext是我的自定义类,它扩展了Entity Framework的ObjectContext类(所以我可以拥有POCO派对).

所以问题 - 我真的必须实现IDisposable吗?

如果是这样,我不知道这是如何可能的,因为每个方法共享相同的存储库实例.

编辑

我正在使用Depedency Injection(StructureMap)将具体的存储库注入服务层.这个模式跟随app堆栈 - 我正在使用ASP.NET MVC,并且具体服务被注入到控制器中.

换一种说法:

  1. 用户请求URL
  2. 创建控制器实例,该实例接收新的ServiceLayer实例,该实例是使用新的Repository实例创建的.
  3. 控制器调用服务上的方法(所有调用使用相同的Repository实例)
  4. 一旦请求被提供,控制器就消失了.

我正在使用混合模式将依赖项注入我的控制器,根据StructureMap文档,这些实例将存储在HttpContext.Current.Items中.

所以,我不能这样做:

   using (var repo = new …
Run Code Online (Sandbox Code Playgroud)

structuremap idisposable iqueryable repository objectcontext

5
推荐指数
1
解决办法
1507
查看次数