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试图注入参数最多的一个(它知道如何解决*(。但是,您可以明确地告诉Ninject要注入哪个constructor

public class Test
{
    public Test(INavigationService asd)
    {
        // rnd stuff
    }
    [Inject]
    public Test()
    {
        // other rnd stuff
    }
}

注意:不能将Inject属性放在多个构造函数上。它会抛出一个异常。

更新:这里有另一种解决方法,值得一试。

Bind<ITest>().ToMethod(x => factoryMethod());factoryMethod做两件事:

  1. 检查您的依赖项是否通过Kernel.CanResolve()或其他方式加载
  2. 如果是,则使用参数化的ctor。如果没有,请使用无参数构造函数

感觉俗气,不确定这是否是一个好的模式。如果参数是可选的,那么最好使用属性注入(通常不赞成(或方法注入。