Ninject中的物业注入不起作用

时间:2015-12-03 11:07:39

标签: c# dependency-injection ninject

我有这样一个班级

public sealed class SimpleTextIndex<T> : TextIndex where T : ITextParser
{
    [Inject]
    public T TextParser { get; set; }
    // something...

依赖性解决方法

public void Resolve() 
{
    Kernel = new StandardKernel();
    Kernel.Bind(typeof(ITextParser)).To(typeof(WordTextParser));
    Kernel.Bind(typeof(SimpleTextIndex<>)).ToSelf();
}

WordTextParser是一个实现ITextParser接口的类。 但是,在调用Resolve()方法和内核的Get()方法之后:

var textIndex = kernel.Get<SimpleTextIndex<ITextParser>>();

我收到NullReferenceException(SimpleTextIndex中的TextParser属性为null)! 但是,如果我以这种方式为SimpleTextIndex编写默认构造函数:

public SimpleTextIndex()
{
  DependencyResolver.Kernel.Inject(this);
}

一切正常!为什么?

1 个答案:

答案 0 :(得分:4)

问题是只有在通过构造函数构造对象之后才进行属性注入,即Ninject在构造函数完成之前无法设置属性值。

由于您正在使用从构造函数调用的方法的依赖项,因此该属性尚未设置,因此其值为null。

要么在构造期间不使用依赖项,要么像这样使用构造函数注入:

//[Inject] //remove this attribute
public T TextParser { get; set; }

public SimpleTextIndex(T parser, string text = "")
{
    TextParser = parser;
    ...
}