Asp.net-Mvc
Ninject + ASP.net MVC + Entity Framework - 我的上下文何時處理?
我在我的 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 知道在處理完任何東西後要處理它嗎?
如果
FooDbContextimplementsIDisposable,Ninject 將在請求結束時自動呼叫Dispose它的方法。以下是驗證它的方法:
- 使用預設模板創建一個新的 ASP.NET MVC 3 應用程序
- 安裝
Ninject.Mvc3NuGet 包- 有以下幾點:
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(); } }
RegisterServices在 的方法中添加以下內容~/App_Start/NinjectMVC3.cs:private static void RegisterServices(IKernel kernel) { kernel.Bind<FooDbContext>().ToSelf().InRequestScope(); kernel.Bind<IFooRepository>().To<EFFooRepository>(); }
- 執行應用程序。正如預期的那樣,在請求結束時,
FooDbContext實例被釋放並NotImplementedException拋出異常。