【发布时间】:2011-03-14 11:48:33
【问题描述】:
之前我问过this question。答案导致了另一个问题,就像你在你面前看到的那样。
最初的问题
我的问题是,我有一个自定义 MembershipProvider 使用 AccountRepository 使用 ObjectContext。因为MembershipProvider 是MVC 中的Singleton(据我所知),所以AccountRepository 和它的ObjectContext 应该被注入一次,并在MembershipProvider 的剩余生命周期内保持在那里。
但是,在我的控制器中,我还使用带有对象上下文的存储库。在这些控制器中,我需要通过请求在存储库之间共享对象上下文。我有以下绑定:
Bind<IMyContext>().To<MyObjectContext>().InRequestScope();
// put bindings here
Bind<IAccountRepository>().To<EFAccountRepository>
在Application_Start()
kernel.Inject(Membership.Provider);
问题是 Ninject 在认为请求完成时显然会在对象上下文上调用 dispose(我认为是在 30 秒后)。
我的(不工作的)解决方案
我注意到,当您设置绑定时,您可以指定“注入时”。问题是,我需要“在注入时注入”。 IE。 注入对象上下文注入帐户控制器注入帐户控制器注入成员资格提供程序。而且我好像没有...
我想到的解决方法(但不是很喜欢)。
- 不要在 MVC 中挂起
MyMembershipProvider。只需将它的一个实例(后面和接口)传递给需要它的控制器,就像我对存储库所做的那样。然后 Ninject 将根据请求实例化提供程序。我不喜欢它,因为我确信 MVC 有理由将成员资格提供程序实例化为单例。 - 查找每个请求都会发生的事件,并在每个事件中再次调用
kernel.Inject。重新初始化每个请求的提供者几乎等同于重新实例化,除了更脏。 - 为会员提供者创建一个单独的帐户存储库,我可以以不同的方式绑定到它。因为 Ninject 而改变我的对象模型似乎不太合适。
结论
恕我直言,第一个解决方法是最好的。但是,我更愿意找到一种方法来设置 Ninject 以我想要的方式绑定。
我该怎么办?
【问题讨论】:
-
我 +1 是因为使用了单数人称代词。没关系,我们把它带回来:)
标签: .net asp.net-mvc-3 ninject