我在我的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>
答案 0 :(得分:11)
如果FooDbContext
实施IDisposable
,Ninject会在请求结束时自动调用Dispose
方法。
以下是验证方法:
Ninject.Mvc3
NuGet包请注意以下事项:
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
的{{1}}方法中添加以下内容:
~/App_Start/NinjectMVC3.cs
运行该应用程序。正如请求结束时所预期的那样,private static void RegisterServices(IKernel kernel)
{
kernel.Bind<FooDbContext>().ToSelf().InRequestScope();
kernel.Bind<IFooRepository>().To<EFFooRepository>();
}
实例已被释放,并且抛出了FooDbContext
异常。