Asp.net-Mvc

Ninject + ASP.net MVC + Entity Framework - 我的上下文何時處理?

  • April 27, 2014

我在我的 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 知道在處理完任何東西後要處理它嗎?

如果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();
   }
}
  1. RegisterServices在 的方法中添加以下內容~/App_Start/NinjectMVC3.cs
private static void RegisterServices(IKernel kernel)
{
   kernel.Bind<FooDbContext>().ToSelf().InRequestScope();
   kernel.Bind<IFooRepository>().To<EFFooRepository>();
}
  1. 執行應用程序。正如預期的那樣,在請求結束時,FooDbContext實例被釋放並NotImplementedException拋出異常。

引用自:https://stackoverflow.com/questions/7450192