在 Ninject 中,这是我要使用子作用域的地方吗?

In Ninject, is this where I would use a child scope?

我有一个使用 Ninject 3 的 WebAPI 项目。大约 99% 的时间,我的注入都在请求范围内,使用 Ninject.Web.WebApi 扩展。

但是,我遇到一个情况,我需要获得通常注入 Request 范围的类型的 Transient-scoped 版本。理想情况下,它的所有注入也将变为瞬态(或至少是一个独立的范围)。

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

所以我的 class,我们就称它为 Frog,注册为 .InRequestScope(),因为大多数时候,这就是我想要我的 Frog 的方式。

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

所以,我在考虑工厂模式,在那里我有一个 FrogFactory,当我调用 FrogFactory.Create 时,它使用 Ninject 来解析一个 Frog,但它是一个新的、独特的 Frog每次调用 FrogFactory.Create(); 时的实例;

(请注意,对于我分享我的青蛙的所有那些地方,Frog 仍然需要有一个 .InRequestScope() 绑定)。

现在,我的青蛙也有注射器,所以我宁愿我的青蛙工厂仍然使用Ninject来解决青蛙,而不是手工新建一个。

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

您可能正在寻找 .WhenXxx() 条件绑定方法。您将需要一些标准来区分 Transient 作用域的 Frog 消费者和您在条件绑定中使用的其他消费者,例如 class 名称,一个应用于 class 的属性,一个应用于 class 的属性构造函数参数等

那么您的绑定将类似于:

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

Bind<IFrog>().To<MyRequestFrog>()
    .InRequestScope();

如果提供的方法中 none 适合您的用例,您可以调用泛型 .When() 并提供谓词来确定条件。

请注意,您还需要为注入到 MyTransientFrog 中的任何依赖项指定条件绑定,以使它们也成为瞬态的,如果它们还没有的话。

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

(瞬态作用域是默认作用域,隐含在普通绑定中,但此处显示是为了清楚起见)