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

J.W*_*.W. 10 dependency-injection ninject

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

  • TransientBehavior - 每次请求一个新类型的实例.
  • SingletonBehavior - 仅创建该类型的单个实例,并为每个后续请求返回相同的实例.
  • OnePerThreadBehavior - 将为每个线程创建该类型的一个实例.
  • OnePerRequestBehavior - 将根据Web请求创建该类型的一个实例,并在请求结束时销毁.

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

Pet*_*yer 13

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

Bind<MembershipProvider>()
  .ToMethod(ctx => Membership.Provider);
Run Code Online (Sandbox Code Playgroud)

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

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

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

所有这一切,我个人的偏好是使用OnePerRequestBehavior,这样我知道Ninject将为每个请求调用我的lambda一次.不确定是否有必要,但我喜欢每次请求从Membership.Provider获取提供程序的想法,因为我认为你无法对Membership.Provider如何或何时设置进行假设,尽管你可能会发现你是否挖掘得足够多用反射器.

Bind<MembershipProvider>()
  .ToMethod(ctx => Membership.Provider)
  .Using<OnePerRequestBehavior>();
Run Code Online (Sandbox Code Playgroud)

祝好运.对不起你的问题在这里待了这么久!