之前我提出了这个问题。得到的答案又引发了另一个问题,就像在你面前看到的那样。
最初的问题
我的问题是,我有一个使用ObjectContext
的自定义MembershipProvider
,它使用一个AccountRepository
。因为MembershipProvider
在MVC中是单例(据我所知),AccountRepository
及其ObjectContext
应该在注入一次后在MembershipProvider
的整个生命周期内保持不变。
然而,在我的控制器中,我也使用带有对象上下文的存储库。在这些控制器中,我需要对象上下文在请求期间在存储库之间共享。我有以下绑定:
Bind<IMyContext>().To<MyObjectContext>().InRequestScope();
// put bindings here
Bind<IAccountRepository>().To<EFAccountRepository>
在 Application_Start()
中
kernel.Inject(Membership.Provider);
问题在于Ninject在认为请求完成后(我想是30秒后)会调用对象上下文上的dispose方法。
我的(不起作用)解决方案
我注意到当您设置绑定时,可以指定“注入到”。问题是,我需要“注入到”的“注入到”。即将对象上下文“注入”到帐户控制器中,“注入”帐户控制器时“注入”成员资格提供程序。而我好像没有那个...
我想到的解决方法(但并不太喜欢)
1. 不要在MVC中挂起MyMembershipProvider。只需向需要它的控制器传递一个实例(在接口后面),就像我与存储库一样。然后Ninject将每个请求实例化提供程序。我不喜欢它,因为我确定MVC有一个单例实例化成员身份验证提供程序的原因。 2. 查找每个请求发生的事件,并在每个事件中再次调用kernel.Inject。每个请求重新初始化提供程序几乎等同于重新实例化,除了更脏。 3. 为成员身份提供程序创建单独的帐户存储库,以便可以以不同的方式进行绑定。更改对象模型似乎不合适,因为Ninject。
结论
我认为第一个解决方法是最好的。但是,我更希望找到一种设置Ninject以按照我想要的方式进行绑定的方法。
我该怎么办?