10

我对 NInject 绑定很陌生,这就是 NInject 所描述的。

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

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

4

1 回答 1

13

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

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

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

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

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

综上所述,我个人的偏好是使用OnePerRequestBehavior,这样我知道 Ninject 将为每个请求调用一次我的 lambda。不确定是否有必要,但我喜欢每次请求都从Membership.Provider获取提供程序的想法,因为我认为您无法假设Membership.Provider的设置方式或时间,尽管您可能会发现您是否足够深入带反光板。

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

祝你好运。抱歉,您的问题在这里搁置了这么久!

于 2009-08-11T13:42:21.240 回答