Dependency injection 在NInject中绑定MembershipProvider时是否应该使用InSingletonScope?

Dependency injection 在NInject中绑定MembershipProvider时是否应该使用InSingletonScope?,dependency-injection,ninject,Dependency Injection,Ninject,我对NInject绑定相当陌生,以下是NInject描述的内容 TransientBehavior-每次请求时都会创建该类型的新实例 SingletonBehavior-将只创建该类型的单个实例,并且将为每个后续请求返回相同的实例 OnePerThreadBehavior-将为每个线程创建一个该类型的实例 OnePerRequestBehavior-每个web请求将创建一个该类型的实例,并在请求结束时销毁 如果我想将MembershipProvider绑定到SqlMembershipProv

我对NInject绑定相当陌生,以下是NInject描述的内容

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

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

ASP.Net已经通过staticmembership类及其staticprovider属性提供了当前成员资格提供程序的静态实例。绑定可能位于应用程序的启动方法中,如下所示:

Bind<MembershipProvider>()
  .ToMethod(ctx => Membership.Provider);
Bind()
.ToMethod(ctx=>Membership.Provider);
同样,因为membership.Provider是一个静态的,它已经有点像一个单例了,所以您尝试应用的行为实际上并不重要

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

我认为可能有一个参数用于显式指定单例行为,因为Ninject可能会在第一次需要注入成员身份提供程序时“缓存”lambda返回的值,从而节省执行lambda的开销。我不是100%确定Ninject在这种情况下是如何工作的,但这似乎是合理的

综上所述,我个人的偏好是使用OnePerRequestBehavior,这样我知道Ninject会为每个请求调用我的lambda一次。我不确定这是否必要,但我喜欢从会员资格中获取提供者的想法。提供者每次请求一次,因为我认为您无法对会员资格的方式或时间做出假设。提供者获取设置,尽管您可能会发现是否使用Reflector挖掘得足够多

Bind<MembershipProvider>()
  .ToMethod(ctx => Membership.Provider)
  .Using<OnePerRequestBehavior>();
Bind()
.ToMethod(ctx=>Membership.Provider)
.使用();

祝你好运。对不起,你的问题在这里放了这么久

另请参见:谢谢,我只是担心如果用户注销而其他人登录,Ninject将无法保留前一个用户。你能确认一下吗?