我有这样一个班级
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);
}
一切正常!为什么?
答案 0 :(得分:4)
问题是只有在通过构造函数构造对象之后才进行属性注入,即Ninject在构造函数完成之前无法设置属性值。
由于您正在使用从构造函数调用的方法的依赖项,因此该属性尚未设置,因此其值为null。
要么在构造期间不使用依赖项,要么像这样使用构造函数注入:
//[Inject] //remove this attribute
public T TextParser { get; set; }
public SimpleTextIndex(T parser, string text = "")
{
TextParser = parser;
...
}