用Ninject注入构造函数2

本文关键字:构造函数 注入 Ninject | 更新日期: 2023-09-27 17:54:09

我使用了带有MVC3的Ninject来自动注入构造函数参数。效果很好。

如何对非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();
    }
}

我该如何修改代码以使其工作?

用Ninject注入构造函数2

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

不就是:

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

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

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