dependency-injection - 在 NInject 中绑定(bind) MembershipProvider 时应该使用 InSingletonScope 吗?

标签 dependency-injection ninject

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

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

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

    最佳答案

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

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

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

    通过在上述代码段中未指定任何行为,Ninject 将默认为 transient 行为。在这种绑定(bind)中,我相信这相当于调用返回 的 lambda。 Membership.Provider 每次需要注入(inject)一个 MembershipProvider 类型。

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

    综上所述,我个人的偏好是使用 OnePerRequestBehavior ,这样我就知道 Ninject 会为每个请求调用一次我的 lambda。不确定是否有必要,但我喜欢从 获取提供程序的想法Membership.Provider 每个请求一次,因为我认为您无法对 的方式或时间做出假设Membership.Provider 设置好了,尽管您可能会发现您是否使用反射器进行了足够的挖掘。
    Bind<MembershipProvider>()
      .ToMethod(ctx => Membership.Provider)
      .Using<OnePerRequestBehavior>();
    

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

    关于dependency-injection - 在 NInject 中绑定(bind) MembershipProvider 时应该使用 InSingletonScope 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1054152/

    相关文章:

    Ember.js:如何将依赖项注入(inject)适配器?

    c# - 在类似架构的插件中使用 Ninject

    c# - Ninject + MVC3 没有注入(inject) Controller

    c# - 在 .NET core 中注册所有类型 T 接口(interface)的实现

    不使用反射的 C# 字符串到对象

    php - CakePHP:将 'Services' 逻辑放在哪里

    ninject - 使用 ServiceStack 和 NinjectContainerAdapter 的一次性请求生命周期

    c# - MVC 4 Web Api Controller 没有默认构造函数?

    c# - 通用注入(inject)工厂

    java - 打破循环依赖以使用依赖注入(inject)