早些时候我问this question。答案导致了另一个问题,就像你在你面前一样。
我的问题是,我使用MembershipProvider
使用AccountRepository
进行自定义ObjectContext
。因为MembershipProvider
在MVC中是Singleton
(据我所知),AccountRepository
及其ObjectContext
应该注入一次并留在{{1}的其余部分一生的时间。
但是,在我的控制器中,我还使用具有对象上下文的存储库。在这些控制器中,我需要在存储库与请求之间共享对象上下文。我有以下绑定:
MembershipProvider
和Bind<IMyContext>().To<MyObjectContext>().InRequestScope();
// put bindings here
Bind<IAccountRepository>().To<EFAccountRepository>
Application_Start()
问题在于Ninject在认为请求完成时显然会调用对象上下文(我想30秒后)。
我注意到,当您设置绑定时,您可以指定“何时注入”。问题是,我需要“注入时注入”。即将对象上下文注入帐户控制器时将帐户控制器注入到成员资格提供程序时。我似乎没有......
kernel.Inject(Membership.Provider);
。只需将它的一个实例(后面和接口)传递给需要它的控制器,就像我使用存储库一样。然后Ninject将根据请求实例化提供程序。我不喜欢它,因为我确信MVC有理由将会员提供者实例化为单身人士。MyMembershipProvider
。每次请求重新初始化提供程序几乎等同于重新实例化,除了更脏。我该怎么办?
答案 0 :(得分:3)
.InRequestScope()
位导致您的某些对象被处置(请参阅Cache and Collect)。
您需要在提供提供程序的依赖项时不要进行此操作(按请求进行范围设定)。
实现这一目标的一种方法是通过两个绑定 - 一个用于请求处理分支,一个用于全局上下文,即添加When
...使用context.ParentContext
...链来控制它是InRequestScope()
还是不是
可悲的是,我现在没有时间给出完整答案,relevant docs目前与代码不同步。