我正在为一个项目评估Ninject,我唯一遇到的问题是它在属性注入时无声地失败。如果我打电话
Kernel.Get<ISomething>();
对于错误的绑定,它将失败并出现异常,但如果我使用属性注入:
[Inject]
public ISomething Something { get; set;}
它无声地失败了。在我使用引用之前我不知道有问题,它是null。有关如何使此失败的任何想法都有例外吗?
答案 0 :(得分:1)
这根本不正确。虽然首选构造函数注入(作为Remo注释),但如果Ninject看到[Inject]
属性属性且没有绑定,则将抛出ActivationException
。
这是一个例子。
相关性:
public interface IHello
{
void SayHello();
}
public class Hello : IHello
{
public void SayHello()
{
Console.WriteLine("Hello world!");
}
}
依赖类:
public class MyApp : IApp
{
public virtual void Run()
{
Hello.SayHello();
}
[Inject]
public IHello Hello { get; set; }
}
主程序:
class Program
{
static void Main(string[] args)
{
var kernel = new StandardKernel();
kernel.Bind<MyApp>().ToSelf();
//kernel.Bind<IHello>().To<Hello>();
var app = kernel.Get<MyApp>();
app.Run();
}
}
如果你运行它,你将得到以下例外:
Error activating IHello No matching bindings are available, and the type is not self-bindable. Activation path: 2) Injection of dependency IHello into property Hello of type MyApp 1) Request for MyApp
取消注释上面的kernel.Bind<IHello>().To<Hello>()
行,它会正常运行。
正如Ruben评论的那样,如果您还将[Optional]
添加到[Inject]
- ed属性,Ninject将只会“无声地失败”。这是因为你现在告诉Ninject缺少绑定不失败,而是预期的情况。否则,属性注入与构造函数注入完全相同。
我怀疑你可能会对那些不熟悉依赖注入的人犯一个常见的错误:用[Inject]
实例化一个依赖类(带有new
ed属性)并假设注入“只是发生”。它没有那种方式。
为了使Ninject或任何其他DI库发挥其神奇作用,必须使用绑定根实例化容器 - 换句话说,无论哪个类包含 Something
属性本身必须使用kernel.Get<ClassContainingSomething>()
创建。