在Ninject中,我会使用子范围吗?

时间:2018-06-13 00:49:46

标签: c# ninject

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

但是,我有一个案例,我需要获得一个通常用Request范围注入的Transient-scoped版本的类型。理想情况下,它的所有注射也会变成瞬态(或至少是一个孤立的范围)。

所以我认为应该有一些方法可以使用Factory模式,但我不确定如何配置它:

所以我的班级,让我们称之为Frog,注册为.InRequestScope(),因为大部分时间,这就是我想要我的青蛙的方式。

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

所以,我正在考虑Factory Pattern,我有一个FrogFactory,当我调用FrogFactory.Create时,它使用Ninject来解析Frog,但每次调用FrogFactory时它都是一个新的,独特的Frog实例。创建();

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

现在,我的青蛙也有注射,所以我更喜欢我的FrogFactory仍然使用Ninject来解决青蛙,而不仅仅是手工新手。

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

1 个答案:

答案 0 :(得分:1)

您可能正在寻找.WhenXxx()条件绑定方法。您将需要一些条件来将Transient范围的Frog使用者与其他人(在条件绑定中使用)区分开来,例如类名,应用于类的属性,应用于构造函数参数的属性等。

然后您的绑定将类似于:

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

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

如果所提供的方法都不适合您的用例,则可以调用通用.When()并提供谓词来确定条件。

请注意,您还需要对注入MyTransientFrog的任何依赖项指定条件绑定,以使它们也可以是瞬态的(如果尚未绑定)。

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

(临时作用域是默认范围,隐含在普通绑定中,但为清楚起见在此处显示)