在NInject中绑定MembershipProvider时我应该使用InSingletonScope吗?

时间:2009-06-28 03:18:37

标签: dependency-injection ninject

我是NInject绑定的新手,这是NInject描述的内容。

  • TransientBehavior - 每次请求时都会创建该类型的新实例。
  • SingletonBehavior - 只会创建该类型的单个实例,并且会为每个后续请求返回相同的实例。
  • OnePerThreadBehavior - 每个帖子都会创建一个类型的实例。
  • OnePerRequestBehavior - 每个Web请求都会创建一个类型的实例,并在请求结束时销毁。

如果我想将MembershipProvider绑定到SqlMembershipProvider,我应该使用SingletonBehavior,因为我只需要一个sql成员资格提供程序吗?

1 个答案:

答案 0 :(得分:13)

ASP.Net已经通过静态成员资格类及其静态提供程序属性提供了当前成员资格提供程序的静态实例。绑定可能在您的Application_Start方法中,看起来像这样:

Bind<MembershipProvider>()
  .ToMethod(ctx => Membership.Provider);

同样,因为 Memberhip.Provider 是静态的,它有点像单身,所以你尝试应用的行为并不重要。

通过不在上面的代码段中指定任何行为,Ninject将默认为瞬态行为。在这种绑定中,我相信每次需要注入 MembershipProvider 类型时,将调用返回 Membership.Provider 的lambda。

我想可能有一个明确指定单例行为的参数,因为Ninject可能会在第一次注入 MembershipProvider 时“缓存”lambda返回的值,实际上保存了执行lambda的开销。我不是百分之百确定Ninject是如何在这种情况下工作的,但它似乎是合理的。

所有这一切,我个人的偏好是使用 OnePerRequestBehavior ,这样我就知道Ninject将为每个请求调用一次lambda。不确定是否有必要,但我喜欢每次请求后从 Membership.Provider 获取提供程序的想法,因为我认为您无法对 Membership.Provider get set,尽管你可能会发现你是否用Reflector进行了足够的挖掘。

Bind<MembershipProvider>()
  .ToMethod(ctx => Membership.Provider)
  .Using<OnePerRequestBehavior>();
祝你好运。对不起,你的问题在这里待了这么久!