如何设置NInject? (我无法解决“Bind”,在“绑定<iweapon>()。”<sword>();“)</sword> </iweapon>

时间:2010-03-26 03:58:15

标签: ninject

我对doco感到困惑,我应该如何设置Ninject。我看到了不同的做法,一些v2与v1的混淆可能包括......

问题 - 我的WinForms应用程序中为NInject设置的最佳方法是什么(即需要几行代码)。我假设这将进入MainForm Load方法。换句话说,在我到达之前我必须拥有什么代码:

Bind<IWeapon>().To<Sword>();

我有以下代码,所以实际上我只想澄清一下我的MainForm.Load()中需要的设置和绑定代码,最终得到一个具体的Samurai实例?

internal interface IWeapon
{
    void Hit(string target);
}

class Sword : IWeapon
{
    public void Hit(string target)
    {
        Console.WriteLine("Chopped {0} clean in half", target);
    }
}

class Samurai
{
    private IWeapon _weapon;

    [Inject]
    public Samurai(IWeapon weapon)
    {
        _weapon = weapon;
    }

    public void Attack(string target)
    {
        _weapon.Hit(target);
    }
}

感谢

PS。我尝试过以下代码,但是我无法解决“Bind”问题。这是从哪里来的?我会丢失什么DLL或“使用”语句?

private void MainForm_Load(object sender, EventArgs e)
{
    Bind<IWeapon>().To<Sword>();   // <==  *** CAN NOT RESOLVE Bind ***
    IKernel kernel = new StandardKernel();
    var samurai = kernel.Get<Samurai>();

1 个答案:

答案 0 :(得分:2)

这里缺少的部分是你必须初始化内核并传入你定义的具有Bind的模块。

所以你需要一个类似这样的模块:

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

然后在你的表单中加载实例化内核,如下所示:

private void MainForm_Load(object sender, EventArgs e)
{
    IKernel kernel = new StandardKernel(new WeaponModule());
    var samurai = kernel.Get<Samurai>();

另外,如果您使用的是Ninject 2,则不需要在构造函数上使用[Inject]属性,Ninject会自行计算出来。