我正在评估一个项目的Ninject,唯一的问题是它在注入属性时失败了。如果我叫Ninject无法失败
Kernel.Get<ISomething>();
一个错误的结合,它将失败,一个例外,但如果我使用属性注入:
[Inject]
public ISomething Something { get; set;}
它静静地失败。我不知道有什么问题,直到我去使用参考,它是空的。任何想法如何使这失败与例外?
我正在评估一个项目的Ninject,唯一的问题是它在注入属性时失败了。如果我叫Ninject无法失败
Kernel.Get<ISomething>();
一个错误的结合,它将失败,一个例外,但如果我使用属性注入:
[Inject]
public ISomething Something { get; set;}
它静静地失败。我不知道有什么问题,直到我去使用参考,它是空的。任何想法如何使这失败与例外?
这根本不正确。尽管构造函数注入是首选(如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
和假设注入“恰好”。它不这样工作。
为了Ninject或任何其他DI图书馆管理员的工作它的魔力,你必须实例化容器与绑定根 - 换句话说,无论哪个阶级包含的Something
财产本身必须使用kernel.Get<ClassContainingSomething>()
创建。
如果你'Kernel.Get()'它会失败吗?想想它,但只是想确保你不希望'new'以不同的方式工作,因为Ninject就在身边。推荐的方法是更喜欢ctor注入(请参阅ninject wiki),因为使用它时完全没有混淆。 –
是鲁宾是对的。如果绑定丢失,则属性注入会创建与构造函数注入相同的异常。但无论如何,建设者注射应该是可取的。 –
为了清楚起见,这意味着我在上面的猜测中错误地认为它可能不是。如果你想表示你没有关注某个特定项是否可以解析并且很乐意让它保持为空,你需要使用'[Optional]'。还有一种方法可以打开'注入空语义'(这里最近的问题涵盖了这个问题),但这是另一回事。 BTW强烈建议阅读@Mark Seeman关于如何最佳使用DI的建议 –