Ninject + ASP.net MVC +实体框架 - 我的上下文何时处理?

时间:2011-09-16 20:43:31

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

我在我的MVC 3应用程序中使用Ninject,其中一个依赖项是在Entity Framework上:

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是否知道在完成任何事情后处理它?<​​/ p>

1 个答案:

答案 0 :(得分:11)

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

以下是验证方法:

  1. 使用默认模板
  2. 创建新的ASP.NET MVC 3应用程序
  3. 安装Ninject.Mvc3 NuGet包
  4. 请注意以下事项:

    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();
        }
    }
    
  5. RegisterServices的{​​{1}}方法中添加以下内容:

    ~/App_Start/NinjectMVC3.cs
  6. 运行该应用程序。正如请求结束时所预期的那样,private static void RegisterServices(IKernel kernel) { kernel.Bind<FooDbContext>().ToSelf().InRequestScope(); kernel.Bind<IFooRepository>().To<EFFooRepository>(); } 实例已被释放,并且抛出了FooDbContext异常。