Ninject 允许注入多个对象到一个特殊的类型或者接口。例如,我们有一个接口 IWeapon,和两个实现 Sword 和 Dagger :
public interface IWeapon
{
string Hit(string target);
}
public class Sword : IWeapon
{
public string Hit(string target)
{
return "Slice " + target + " in half";
}
}
public class Dagger : IWeapon
{
public string Hit(string target)
{
return "Stab " + target + " to death";
}
}
如下的 Samurai 类,它的构造函数有一个IWeapon类型的数组,这意味着在构造过程中Ninject将与该类型相关的对象赋值给这个数组。
public class Samurai
{
readonly IWeapon[] allWeapons;
public Samurai(IWeapon[] allWeapons)
{
this.allWeapons = allWeapons;
}
public void Attack(string target)
{
foreach (IWeapon weapon in this.allWeapons)
Console.WriteLine(weapon.Hit(target));
}
}
我们可以构造从IWeapon到 Sword 和 Dagger 类型的绑定:
class TestModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<IWeapon>().To<Sword>();
Bind<IWeapon>().To<Dagger>();
}
}
最终,核心会创建一个根据以上配置的模型。我们通过Ninject创建一个 Samurai 对象实例,当调用对象的Attack方法,我们会发现,所有的类型对象被绑定到了IWeapon数组。
class Program
{
public static void Main()
{
Ninject.IKernel kernel = new StandardKernel(new TestModule());
var samurai = kernel.Get<Samurai>();
samurai.Attack("your enemy");
}
}
结果是:
Stab your enemy to death
Slice your enemy in half
内核也提供了一个GetAll方法用于获得同样的输出:
class Program
{
public static void Main()
{
Ninject.IKernel kernel = new StandardKernel(new TestModule());
IEnumerable<IWeapon> weapons = kernel.GetAll<IWeapon>();
foreach(var weapon in weapons)
Console.WriteLine(weapon.Hit("the evildoers"));
}
}