Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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# 构造函数注入Ninject 2_C#_Dependency Injection_Ninject - Fatal编程技术网

C# 构造函数注入Ninject 2

C# 构造函数注入Ninject 2,c#,dependency-injection,ninject,C#,Dependency Injection,Ninject,我已经将Ninject与MVC3一起用于构造函数参数的自动逻辑注入。效果很好 如何对非MVC代码执行类似操作 例如: public class Ninja { private readonly IWeapon _weapon; public Ninja(IWeapon weapon) { _weapon = weapon; } public void Strike() { _weapon.Strike();

我已经将Ninject与MVC3一起用于构造函数参数的自动逻辑注入。效果很好

如何对非MVC代码执行类似操作

例如:

public class Ninja
{
    private readonly IWeapon _weapon;
    public Ninja(IWeapon weapon)
    {
        _weapon = weapon;
    }

    public void Strike()
    {
        _weapon.Strike();
    }
}


public class MyProgram
{
    public void DoStuff()
    {
        var Ninja = new Ninja(); // I'm wanting Ninject to call the parameterized Ninja constructor
        ninja.Strike();
    }

}
我将如何修改代码以使其正常工作?

它不只是:

var ninja = Kernel.Get<Ninja>();
var ninja=Kernel.Get();
显然,您必须通过Ninject解决依赖关系

难道不是:

var ninja = Kernel.Get<Ninja>();
var ninja=Kernel.Get();

显然,您必须通过Ninject解决依赖关系

您需要有一个
StandardKernel
的实例,我们称之为
kernel
,然后使用
kernel.Get()
。这是因为忍者是非抽象的,所以它被认为是与自身有关的。显然,一些具体类型需要绑定到IWeapon,以允许NInject创建Ninja。

您需要一个
StandardKernel
的实例,我们称之为
kernel
,然后使用
kernel.Get()
。这是因为忍者是非抽象的,所以它被认为是与自身有关的。显然,一些具体类型需要绑定到IWeapon,以允许NInject创建Ninja。

公共接口IWeapon
public interface IWeapon
{
    void Strike();
}

public class Sword : IWeapon
{
    public void Strike()
    {
        Console.WriteLine("black ninja strike");
    }
}

public class Ninja
{
    private readonly IWeapon _weapon;
    public Ninja(IWeapon weapon)
    {
        _weapon = weapon;
    }

    public void Strike()
    {
        _weapon.Strike();
    }
}

public class WarriorModule : NinjectModule
{
    public override void Load()
    {
        Bind<IWeapon>().To<Sword>();
    }
}


class Program
{
    static void Main()
    {
        var kernel = new StandardKernel(new WarriorModule());
        var ninja = kernel.Get<Ninja>();
        ninja.Strike();
    }
}
{ 无效罢工(); } 公共级剑:IWeapon { 公众罢工 { 控制台.WriteLine(“黑色忍者罢工”); } } 公共级忍者 { 私人只读IWeapon武器; 公共忍者(IWeapon武器) { _武器=武器; } 公众罢工 { _武器。打击(); } } 公共类WarriorModule:NinjectModule { 公共覆盖无效负载() { 绑定()到(); } } 班级计划 { 静态void Main() { var kernel=新的标准内核(新的WarriorModule()); var ninja=kernel.Get(); 忍者打击(); } }
公共接口IWeapon
{
无效罢工();
}
公共级剑:IWeapon
{
公众罢工
{
控制台.WriteLine(“黑色忍者罢工”);
}
}
公共级忍者
{
私人只读IWeapon武器;
公共忍者(IWeapon武器)
{
_武器=武器;
}
公众罢工
{
_武器。打击();
}
}
公共类WarriorModule:NinjectModule
{
公共覆盖无效负载()
{
绑定()到();
}
}
班级计划
{
静态void Main()
{
var kernel=新的标准内核(新的WarriorModule());
var ninja=kernel.Get();
忍者打击();
}
}

当前内核是否有全局配置?@Adam Tegen:谢天谢地,没有。请搜索服务定位器反模式,然后阅读@Mark Seemann的“为什么”最热门答案。(一些Ninject扩展确实有一个KernelContainer对象,但这只是根据需要,绝对不是一个核心特性)对于ASP.NET,您可能是对的。对于MVVM,我想我需要和Mark谈谈。此外,性能有时也可以证明使用反模式是合理的。此外,我想你是指这篇文章:当前内核是否存在全局性的问题?@Adam Tegen:谢天谢地,没有。搜索一下服务定位器反模式,然后阅读@Mark Seemann对原因的最重要答案。(一些Ninject扩展确实有一个KernelContainer对象,但这只是根据需要,绝对不是一个核心特性)对于ASP.NET,您可能是对的。对于MVVM,我想我需要和Mark谈谈。此外,性能有时也可以证明使用反模式是合理的。此外,我认为您指的是本文: