代码之家  ›  专栏  ›  技术社区  ›  JMarsch

在Ninject中,这是我使用子范围的地方吗?

  •  0
  • JMarsch  · 技术社区  · 6 年前

    我有一个使用Ninject3的WebAPI项目。大约99%的时候,我的注入都在请求范围内,使用ninject.web.webapi扩展。

    但是,我有一个案例,在这个案例中,我需要得到一个类型的临时作用域版本,该类型通常被注入请求作用域。理想情况下,它的所有注入也都将是暂时的(或者至少是一个孤立的范围)。

    所以我想应该有一些方法来使用工厂模式,但是我不确定如何配置它:

    所以我的类,我们称之为frog,注册为.inRequestScope(),因为大多数时候,这就是我想要frog的方式。

    但在这一个地方,我真的需要得到新的,而不是共享的青蛙,因为我正在做一些并行的事情。

    所以,我在想工厂模式,在那里我会有一个青蛙工厂,当我打电话给 FrogFactory.Create ,它使用ninject解析frog,但每次调用frogFactory.create()时,它都是一个新的、唯一的frog实例;

    (注意青蛙仍然需要 .InRequestScope() 在我分享青蛙的所有地方,也都有约束力。

    现在,我的青蛙也有注射,所以我希望我的青蛙工厂仍然使用ninject来解决青蛙的问题,而不仅仅是手工更新。

    我该如何设置?(或者是否有一些Ninject条件绑定魔法让我绕过工厂模式?)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Dave Thieben    6 年前

    .WhenXxx() 条件绑定方法。您将需要一些条件来区分暂时作用域的frog使用者与条件绑定中使用的其他使用者,例如类名、应用于类的属性、应用于构造函数参数的属性等。

    Bind<IFrog>().To<MyTransientFrog>()
        .WhenClassHas<TransientAttribute>()
        .InTransientScope();
    
    Bind<IFrog>().To<MyRequestFrog>()
        .InRequestScope();
    

    如果所提供的方法都不适合您的用例,则可以调用泛型 .When()

    请注意,您还需要在注入到的任何依赖项上指定条件绑定 MyTransientFrog

    Bind<IFrogDependency>().To<MyTransientFrogDependency>()
        .WhenInjectedInto<MyTransientFrog>()
        .InTransientScope();