0

次の例は、Ninjectを使用するように書き直されたように見えますか?

具体的には、武士を手裏剣と剣の両方にどのように結び付けますか?

https://github.com/ninject/ninject/wiki/Dependency-Injection-By-Handから)

interface IWeapon
{
    void Hit(string target);
}

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

class Shuriken : IWeapon
{
    public void Hit(string target)
    {
        Console.WriteLine("Pierced {0}'s armor", target);
    }
}

class Program
{
    public static void Main() 
    {
        var warrior1 = new Samurai(new Shuriken());
        var warrior2 = new Samurai(new Sword());
        warrior1.Attack("the evildoers");
        warrior2.Attack("the evildoers");    
       /* Output...
        * Piereced the evildoers armor.
        * Chopped the evildoers clean in half.
        */
    }
}
4

1 に答える 1

2

IWeapon最初に解決した後で簡単に再バインドできますSamurai

StandardKernel kernel = new StandardKernel();

kernel.Bind<IWeapon>().To<Sword>().Named();
Samurai samurai1 = kernel.Get<Samurai>();
samurai1.Attack("enemy");

kernel.Rebind<IWeapon>().To<Shuriken>();
Samurai samurai2 = kernel.Get<Samurai>();
samurai2.Attack("enemy");

または、名前付きバインディングを使用することもできます。Samurai最初に、コンストラクターを少し再定義Namedして、その依存関係に属性を追加する必要があります。

public Samurai([Named("Melee")]IWeapon weapon)
{
    this.weapon = weapon;
}

次に、バインディングにも名前を付ける必要があります。

StandardKernel kernel = new StandardKernel();

kernel.Bind<IWeapon>().To<Sword>().Named("Melee");
kernel.Bind<IWeapon>().To<Shuriken>().Named("Throwable");

Samurai samurai = kernel.Get<Samurai>();
samurai.Attack("enemy"); // will use Sword

本当に多くの選択肢があります-@scottmによって提供されたリンクを閲覧し、それらをすべてチェックすることをお勧めします。

于 2012-07-19T18:21:22.370 に答える