gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:58:27 25 4
gpt4 key购买 nike

如果我有以下存储库:

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 是我的自定义类,它扩展了 Entity Framework 的 ObjectContext 类(所以我可以有 POCO 聚会)。

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

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

编辑

我正在使用依赖注入(inject)(StructureMap)将具体存储库注入(inject)服务层。这种模式沿应用程序堆栈向下 - 我正在使用 ASP.NET MVC,并将具体服务注入(inject)到 Controller 中。

换句话说:
  • 用户请求 URL
  • Controller 实例被创建,它接收一个新的 ServiceLayer 实例,该实例是用一个新的 Repository 实例创建的。
  • Controller 调用服务上的方法(所有调用使用相同的存储库实例)
  • 一旦请求得到服务, Controller 就消失了。

  • 我正在使用混合模式将依赖项注入(inject)到我的 Controller 中,根据 StructureMap 文档,这会导致实例存储在 HttpContext.Current.Items 中。

    所以,我不能这样做:
       using (var repo = new Repository())
    {
    return repo.Users().ToList();
    }

    因为这破坏了 DI 的全部意义。

    最佳答案

    与 nhibernate 一起使用的一种常见方法是在 begin_request(或其他类似的生命周期事件)中创建 session (ObjectContext),然后在 end_request 中将其处理掉。您可以将该代码放在 HttpModule 中。

    您需要更改您的存储库,以便它注入(inject) ObjectContext。您的存储库应该脱离管理 ObjectContext 生命周期的业务。

    关于repository - 带有 StructureMap (IoC) 的 IQueryable 存储库 - 我如何实现 IDisposable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3665336/

    25 4 0