【问题标题】:Can I specify the scope in Ninject for only this specific situation?我可以仅针对这种特定情况在 Ninject 中指定范围吗?
【发布时间】: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。 注入对象上下文注入帐户控制器注入帐户控制器注入成员资格提供程序。而且我好像没有...

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

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

结论

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

我该怎么办?

【问题讨论】:

  • 我 +1 是因为使用了单数人称代词。没关系,我们把它带回来:)

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


【解决方案1】:

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

您需要在提供提供商的依赖项时避免这种情况(按请求确定范围)。

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

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

【讨论】:

  • 啊,所以可以更精确地指定何时注入什么。我会尝试一下,如果我发现任何东西,我会报告。
  • @Matthijs:是的,有一种机制可以根据需要沿着请求树向上传播,而 When 有一个通用机制可以让你利用它。元数据机制允许您拥有双绑定,然后控制应用哪一个。我真的需要在它所属的文档中写这个!顺便说一句,我最近修改了文档,并且对任何反馈感兴趣,+ 或 - re 哪些部分 a) 需要去 b) 需要扩展或 c) 缺失。这东西显然是(c),但其他两个类别对于那些花了很长时间寻找来源的人来说很难!
  • @Ruben:我会记住的。如果我有任何 cmets,我会报告它们(我想是通过网站)。我对 Ninject 很陌生,所以不要对我抱有太多期望:)。
  • 我一直在确定如何检查范围。有一个函数 GetScope() 返回一个对象。不知道拿什么来比较。
  • @Matthijs:您不需要检查范围——您需要注册两个绑定并在每个绑定上都有一个When,以检查上下文以便说“使用此绑定 [with this范围]当它进入成员资格提供者时”和“使用这个绑定[当它不是时]”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 2015-09-28
  • 2018-06-19
  • 1970-01-01
  • 2012-03-28
  • 2016-12-16
相关资源
最近更新 更多