【问题标题】:Ninject + ASP.net MVC + Entity Framework - when is my context disposed?Ninject + ASP.net MVC + Entity Framework - 我的上下文何时处理?
【发布时间】:2011-11-18 23:53:07
【问题描述】:

我在我的 MVC 3 应用程序中使用 Ninject,我的依赖项之一是实体框架:

interface IFooRepository
{
    Foo GetFoo(int id);
}

public EFFooRepository : IFooRepository
{
    private FooDbContext context;

    public EFFooRepository(FooDbContext context)
    {
        this.context = context;
    }
 }

我在 Ninject 中设置了一个这样的绑定,所以如果我有多个依赖项并且它们都需要数据上下文,它们最终会共享相同的上下文:

Bind<FooDbContext>().ToSelf().InRequestScope();

我不确定我的上下文何时会被处理。由于我不是实例化它的人,它会被处理掉还是会在垃圾收集时被处理掉? Ninject 是否知道在处理完任何东西后要处理它?

【问题讨论】:

    标签: asp.net-mvc entity-framework dependency-injection inversion-of-control ninject


    【解决方案1】:

    如果FooDbContext实现IDisposable,Ninject会在请求结束时自动调用Dispose方法。

    验证方法如下:

    1. 使用默认模板创建一个新的 ASP.NET MVC 3 应用程序
    2. 安装Ninject.Mvc3 NuGet 包
    3. 具备以下条件:

      public interface IFooRepository
      {
      }
      
      public class FooDbContext: IDisposable
      {
          public void Dispose()
          {
              throw new NotImplementedException();
          }
      }
      
      public class EFFooRepository : IFooRepository
      {
          private FooDbContext _context;
      
          public EFFooRepository(FooDbContext context)
          {
              _context = context;
          }
       }
      
      public class HomeController : Controller
      {
          private readonly IFooRepository _repo;
      
          public HomeController(IFooRepository repo)
          {
              _repo = repo;
          }
      
          public ActionResult Index()
          {
              return View();
          }
      }
      
    4. ~/App_Start/NinjectMVC3.csRegisterServices方法中添加以下内容:

      private static void RegisterServices(IKernel kernel)
      {
          kernel.Bind<FooDbContext>().ToSelf().InRequestScope();
          kernel.Bind<IFooRepository>().To<EFFooRepository>();
      }
      
    5. 运行应用程序。正如预期在请求结束时,FooDbContext 实例被释放,NotImplementedException 异常被抛出。

    【讨论】:

    • 这就是我所希望的。我相信 DbContext 实现了 IDisposable。事实上,如果没有,我会感到震惊。谢谢!
    • @Dismissile,是的,DbContext 实现了 IDisposable。
    • 哦,非常好。谢谢你的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多