我是否可以仅针对此特定情况在Ninject中指定范围?

时间:2011-03-14 11:48:34

标签: .net asp.net-mvc-3 ninject

早些时候我问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秒后)。

我的(不工作)解决方案

我注意到,当您设置绑定时,您可以指定“何时注入”。问题是,我需要“注入时注入”。即将对象上下文注入帐户控制器将帐户控制器注入成员资格提供程序时。我似乎没有......

我想到的解决方法(但不太喜欢)。

  1. 不要在MVC中挂起kernel.Inject(Membership.Provider); 。只需将它的一个实例(后面和接口)传递给需要它的控制器,就像我使用存储库一样。然后Ninject将根据请求实例化提供程序。我不喜欢它,因为我确信MVC有理由将会员提供者实例化为单身人士。
  2. 查找每个请求发生的事件,并在每个事件中再次调用MyMembershipProvider。每次请求重新初始化提供程序几乎等同于重新实例化,除了更脏。
  3. 为我可以以不同方式绑定的成员资格提供者创建单独的帐户存储库。由于Ninject,改变我的对象模型似乎不对。
  4. 结论

    恕我直言,第一次解决方案是最好的。但是,我更愿意找到一种方法来将Ninject设置为以我想要的方式绑定。

    我该怎么办?

1 个答案:

答案 0 :(得分:3)

.InRequestScope()位导致您的某些对象被处置(请参阅Cache and Collect)。

您需要在提供提供程序的依赖项时不要进行此操作(按请求进行范围设定)。

实现这一目标的一种方法是通过两个绑定 - 一个用于请求处理分支,一个用于全局上下文,即添加When ...使用context.ParentContext ...链来控制它是InRequestScope()还是不是

可悲的是,我现在没有时间给出完整答案,relevant docs目前与代码不同步。