构造函数注入Ninject 2

时间:2011-05-02 19:52:19

标签: 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();
    }
}


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

}

如何更改代码才能使其正常工作?

3 个答案:

答案 0 :(得分:5)

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();
    }
}

答案 1 :(得分:4)

不会只是:

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

你显然必须通过Ninject解决依赖关系。

答案 2 :(得分:1)

您需要拥有StandardKernel的实例,让我们将其称为kernel,然后使用kernel.Get<Ninja>()。这是有效的,因为忍者是非抽象的,所以它被认为是自己的约束。显然,一些具体类型需要绑定到IWeapon以允许NInject创建Ninja。