Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 死气沉沉_C#_Dependency Injection_Ninject - Fatal编程技术网

C# 死气沉沉

C# 死气沉沉,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,我正在为一个项目评估Ninject,我遇到的唯一问题是,它在属性注入时失败了。如果我打电话 Kernel.Get<ISomething>(); 它默默地失败了。我不知道有什么问题,直到我去使用引用,它是空的。有没有什么办法可以让这个异常失败?这根本不正确。尽管首选构造函数注入(作为Remo注释),但如果Ninject看到[Inject]属性并且没有绑定,它将抛出ActivationException 这里有一个例子 依赖关系: public interface IHello {

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

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的建议