C# 死气沉沉
我正在为一个项目评估Ninject,我遇到的唯一问题是,它在属性注入时失败了。如果我打电话C# 死气沉沉,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,我正在为一个项目评估Ninject,我遇到的唯一问题是,它在属性注入时失败了。如果我打电话 Kernel.Get<ISomething>(); 它默默地失败了。我不知道有什么问题,直到我去使用引用,它是空的。有没有什么办法可以让这个异常失败?这根本不正确。尽管首选构造函数注入(作为Remo注释),但如果Ninject看到[Inject]属性并且没有绑定,它将抛出ActivationException 这里有一个例子 依赖关系: public interface IHello {
Kernel.Get<ISomething>();
它默默地失败了。我不知道有什么问题,直到我去使用引用,它是空的。有没有什么办法可以让这个异常失败?这根本不正确。尽管首选构造函数注入(作为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();
}
}
类程序
{
静态void Main(字符串[]参数)
{
var kernel=新的标准内核();
kernel.Bind().ToSelf();
//kernel.Bind().To();
var-app=kernel.Get();
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
激活IHello时出错
没有匹配的绑定可用,并且类型不可自绑定。
激活路径:
2) 将依赖项IHello注入MyApp类型的属性Hello
1) 请求MyApp
取消注释上面的kernel.Bind().To()
行,它将正确运行
正如Ruben所说,如果您还向[Inject]
-ed属性添加[Optional]
,Ninject只会“无声失败”。这是因为您现在告诉Ninject缺少绑定不是失败,而是一种预期的情况。否则,属性注入的工作原理与构造函数注入完全相同
我怀疑对于不熟悉依赖项注入的人来说,您可能犯了一个常见的错误:使用
new
实例化依赖类(使用[Inject]
ed属性),并假设注入“刚刚发生”。这样不行
为了让Ninject或任何其他DI库发挥其神奇作用,您必须用绑定根实例化容器——换句话说,无论哪个类包含
Something
属性,都必须使用kernel.Get()
来创建它本身,这完全是不正确的。尽管首选构造函数注入(作为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();
}
}
类程序
{
静态void Main(字符串[]参数)
{
var kernel=新的标准内核();
kernel.Bind().ToSelf();
//kernel.Bind().To();
var-app=kernel.Get();
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
激活IHello时出错
没有匹配的绑定可用,并且类型不可自绑定。
激活路径:
2) 将依赖项IHello注入MyApp类型的属性Hello
1) 请求MyApp
取消注释上面的kernel.Bind().To()
行,它将正确运行
正如Ruben所说,如果您还向[Inject]
-ed属性添加[Optional]
,Ninject只会“无声失败”。这是因为您现在告诉Ninject缺少绑定不是失败,而是一种预期的情况。否则,属性注入的工作原理与构造函数注入完全相同
我怀疑对于不熟悉依赖项注入的人来说,您可能犯了一个常见的错误:使用
new
实例化依赖类(使用[Inject]
ed属性),并假设注入“刚刚发生”。这样不行
为了让Ninject或任何其他DI库发挥其魔力,您必须用绑定根实例化容器——换句话说,无论哪个类包含
Something
属性,都必须使用kernel.Get()
创建,如果kernel.Get()
,它是否会自动失败?我想是的,但只是想确保你不希望new
因Ninject的存在而工作不一样。推荐的方法是更喜欢ctor注入(参见ninject wiki),因为使用它时绝对不会产生混淆。是的,Ruben是正确的。如果缺少绑定,属性注入将创建与构造函数注入相同的异常。但不管怎样,只要有可能,就应该首选构造函数注入。为了清楚起见,这意味着我在上面的猜测中错了,它可能不会。如果您想表示您不在乎某个特定项目是否可以解决,并且很乐意将其保留为空,则需要使用[可选]
。还有一种方法可以打开“注入空语义”(这里最近的问题涉及到这一点),但这是另一回事。顺便说一句,强烈建议阅读@Mark Seeman的顶级答案,以获得关于如何最好地使用DIDoes的建议。如果您Kernel.Get()
,DIDoes会自动失败吗?我想是的,但只是想确保你不希望new
因Ninject的存在而工作不一样。推荐的方法是更喜欢ctor注入(参见ninject wiki),因为使用它时绝对不会产生混淆。是的,Ruben是正确的。如果缺少绑定,属性注入将创建与构造函数注入相同的异常。但不管怎样,只要有可能,就应该首选构造函数注入。为了清楚起见,这意味着我在上面的猜测中错了,它可能不会。如果您想表示您不在乎某个特定项目是否可以解决,并且很乐意将其保留为空,则需要使用[可选]
。还有一种方法可以打开“注入空语义”(这里最近的问题涉及到这一点),但这是另一回事。顺便说一句,强烈建议阅读@Mark Seeman的顶级答案,以获得如何最好地使用DI的建议