在 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();
(瞬态作用域是默认作用域,隐含在普通绑定中,但此处显示是为了清楚起见)
我有一个使用 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();
(瞬态作用域是默认作用域,隐含在普通绑定中,但此处显示是为了清楚起见)