Ninject中的属性注入不起作用

本文关键字:注入 不起作用 属性 Ninject | 更新日期: 2023-09-27 18:25:25

我有这样一个类

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);
}

一切都很好!为什么?

Ninject中的属性注入不起作用

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

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

要么在构建过程中不使用依赖项,要么像这样使用构造函数注入:

//[Inject] //remove this attribute
public T TextParser { get; set; }
public SimpleTextIndex(T parser, string text = "")
{
    TextParser = parser;
    ...
}