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

Dis*_*ile 9 asp.net-mvc entity-framework dependency-injection ninject inversion-of-control

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

interface IFooRepository
{
    Foo GetFoo(int id);
}

public EFFooRepository : IFooRepository
{
    private FooDbContext context;

    public EFFooRepository(FooDbContext context)
    {
        this.context = context;
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

Bind<FooDbContext>().ToSelf().InRequestScope();
Run Code Online (Sandbox Code Playgroud)

我不确定何时处理我的背景.既然我不是那个实例化它的人,它会不会被处理掉,或者它会在垃圾收集时被处理掉?Ninject是否知道在完成任何事情后处理它?

Dar*_*rov 11

如果是FooDbContextimplements IDisposable,Ninject会Dispose在请求结束时自动调用它上面的方法.

以下是验证方法:

  1. 使用默认模板创建新的ASP.NET MVC 3应用程序
  2. 安装Ninject.Mvc3NuGet包
  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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  4. 在以下RegisterServices方法中添加以下内容~/App_Start/NinjectMVC3.cs:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<FooDbContext>().ToSelf().InRequestScope();
        kernel.Bind<IFooRepository>().To<EFFooRepository>();
    }
    
    Run Code Online (Sandbox Code Playgroud)
  5. 运行该应用程序.正如在请求结束时所预期的那样,FooDbContext实例被处理并NotImplementedException抛出异常.

  • @Dismissile,是的,DbContext实现了IDisposable. (2认同)