给出一些简单的类和接口......
public interface IClass1 { }; public class Class1 : IClass1 { }
public interface IClass2 { }; public class Class2 : IClass2 { }
......这个可注射的代码......
public class Class3
{
public Class3(IClass1 class1, IClass2 class2)
{
}
public Class3(IClass1 class1)
{
}
}
...而且这个设置......
static void Main(string[] args)
{
var kernel = new StandardKernel();
kernel.Bind<IClass1>().To<Class1>();
var instance = kernel.Get<IClass1>();
}
Ninject将崩溃,声明它无法找到IClass2的绑定。
在这一点上,这是可以理解的,因为它没有IClass2的绑定。
但它确实可以访问不需要这种绑定的构造函数。
经过一番调查,我们发现这两个构造函数都具有相同的分数&#39;因为它们都具有相同数量的可解析参数。
Ninject似乎将它们视为同等有效。它选择需要IClass2参数的构造函数,因为它在代码中首先列出。
因此,如果我颠倒这些构造函数的顺序......
public class Class3
{
public Class3(IClass1 class1)
{
}
public Class3(IClass1 class1, IClass2 class2)
{
}
}
......一切正常。
因此,我的问题是......
为什么构造函数(需要IClass2参数的构造函数)在具有无法解析的参数时才被视为有效的竞争者?