Ninject特定于构造函数的代码顺序
本文关键字:代码 顺序 构造函数 Ninject | 更新日期: 2023-09-27 18:02:30
更新
我设法避开了这个问题。现在我检查自己,是否可以解决依赖关系。如果没有,我将寻找一个无参数构造函数(通过反射(并调用它。但我认为这是Ninjects的工作份额。。。因此,与其说是真正的解决方案,不如说是一种变通方法。
原始问题
public class Test
{
public Test(INavigationService asd)
{
// rnd stuff
}
public Test()
{
// other rnd stuff
}
}
我上了这个测试课。现在,我想要它的两个实例,由Ninject创建。所以我做了以下事情:
Test test = Kernel.Get<Test>();
并遇到异常:"Ninject.ActivationException:激活INavigationService时出错"。
如果我像这个一样重新排序构造函数
public class Test
{
public Test()
{
// other rnd stuff
}
public Test(INavigationService asd)
{
// rnd stuff
}
}
它是有效的。但我不能确定,我在Ninject中使用的每个类都有"正确"的构造函数。那么,有没有办法告诉Ninject不要忽略无参数构造函数,如果它不是第一个构造函数的话?
提前谢谢。
Ninject试图注入参数最多的一个(它知道如何解决*(。但是,您可以明确地告诉Ninject要注入哪个constructor
:
public class Test
{
public Test(INavigationService asd)
{
// rnd stuff
}
[Inject]
public Test()
{
// other rnd stuff
}
}
注意:不能将Inject
属性放在多个构造函数上。它会抛出一个异常。
更新:这里有另一种解决方法,值得一试。
Bind<ITest>().ToMethod(x => factoryMethod());
factoryMethod
做两件事:
- 检查您的依赖项是否通过
Kernel.CanResolve()
或其他方式加载 - 如果是,则使用参数化的
ctor
。如果没有,请使用无参数构造函数
感觉俗气,不确定这是否是一个好的模式。如果参数是可选的,那么最好使用属性注入(通常不赞成(或方法注入。