我有一个使用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条件绑定魔法让我围绕工厂模式?)
答案 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();
(临时作用域是默认范围,隐含在普通绑定中,但为清楚起见在此处显示)