Multi injection

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"));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值