9

我使用Ninject在我的MVC 3应用和我的一个依赖是实体框架:Ninject + ASP.net MVC +实体框架 - 何时处理我的上下文?

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是否知道在完成任何事情时能够处理任何事情?

回答

11

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

这里是你如何可以验证:

  1. 创建一个使用默认模板
  2. 一个新的ASP.NET MVC 3应用程序安装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. 在的RegisterServices方法中加入以下内容:

    private static void RegisterServices(IKernel kernel) 
    { 
        kernel.Bind<FooDbContext>().ToSelf().InRequestScope(); 
        kernel.Bind<IFooRepository>().To<EFFooRepository>(); 
    } 
    
  5. 运行该应用程序。正如预期在请求结束时,将丢弃FooDbContext实例并引发NotImplementedException异常。

+0

这就是我所希望的。我相信DbContext实现了IDisposable。事实上,如果没有,我会感到震惊。谢谢! – Dismissile

+2

@Dismissile,是的,DbContext实现IDisposable。 –

+0

哦,非常好。谢谢你的例子。 – Dismissile