Конструктор Внедрить с Ninject 2 - PullRequest
1 голос
/ 02 мая 2011

Я использовал 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 ]

5 голосов
/ 02 мая 2011
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();
    }
}
4 голосов
/ 02 мая 2011

Не будет ли это просто:

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

Вы, очевидно, должны разрешить зависимость через Ninject.

1 голос
/ 02 мая 2011

Вам нужно иметь экземпляр StandardKernel, назовем его kernel и затем используем kernel.Get<Ninja>(). Это работает, поскольку ниндзя не является абстрактным, поэтому считается связанным с самим собой. Очевидно, что некоторые конкретные типы должны быть связаны с IWeapon, чтобы позволить NInject создавать ниндзя.

...