Ninject特定于构造函数的代码顺序

the*_*spy 3 c# ninject

更新

我设法解决了这个问题.现在我检查自己,是否可以解决依赖关系.如果没有,我将寻找一个无参数构造函数(通过Reflection)并调用它.但我认为这是Ninjects的工作份额...所以更多的是解决方法而不是真正的解决方案.

原始问题

public class Test
{
    public Test(INavigationService asd)
    {
        // rnd stuff
    }

    public Test()
    {
        // other rnd stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

我有这个Test课程.现在,我想要它的两个实例,由Ninject创建.所以我做了以下事情:

Test test = Kernel.Get<Test>();
Run Code Online (Sandbox Code Playgroud)

并遇到异常:"Ninject.ActivationException:激活INavigationService时出错".

如果我像这样重新排序构造函数

public class Test
{
    public Test()
    {
        // other rnd stuff
    }

    public Test(INavigationService asd)
    {
        // rnd stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

有用.但我无法确定,我使用Ninject的每个类都有"正确"顺序的构造函数.那么,有没有办法告诉Ninject不要忽略无参数构造函数,如果它不是第一个?

先感谢您.

Mrc*_*ief 6

Ninject尝试注入具有最多参数的那个(它知道如何解析*).但是,您可以明确地告诉Ninject constructor注入哪些内容:

public class Test
{

    public Test(INavigationService asd)
    {
        // rnd stuff
    }

    [Inject]
    public Test()
    {
        // other rnd stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

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

更新: 这是解决这个问题的另一种方法,值得一试.

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

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

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