Ninject无声地失败

时间:2011-07-06 16:44:15

标签: c# dependency-injection ninject

我正在为一个项目评估Ninject,我唯一遇到的问题是它在属性注入时无声地失败。如果我打电话

Kernel.Get<ISomething>();

对于错误的绑定,它将失败并出现异常,但如果我使用属性注入:

[Inject]
public ISomething Something { get; set;}

它无声地失败了。在我使用引用之前我不知道有问题,它是null。有关如何使此失败的任何想法都有例外吗?

1 个答案:

答案 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>()创建。

相关问题