C# 在使用上下文绑定时,如何避免在注入目标程序集上引用Ninject

C# 在使用上下文绑定时,如何避免在注入目标程序集上引用Ninject,c#,.net,dependency-injection,ninject,contextual-binding,C#,.net,Dependency Injection,Ninject,Contextual Binding,我在看。这适用于具有多个抽象实现的情况,注入目标类中的上下文决定了哪些实现被注入 在文档中,使用“命名绑定”的示例如下所示: Bind<IWeapon>().To<Shuriken>().Named("Strong"); Bind<IWeapon>().To<Dagger>().Named("Weak"); class WeakAttack { readonly IWeapon _weapon; public WeakAttack

我在看。这适用于具有多个抽象实现的情况,注入目标类中的上下文决定了哪些实现被注入

在文档中,使用“命名绑定”的示例如下所示:

Bind<IWeapon>().To<Shuriken>().Named("Strong");
Bind<IWeapon>().To<Dagger>().Named("Weak");

class WeakAttack {
    readonly IWeapon _weapon;
    public WeakAttack([Named("Weak")] IWeapon weakWeapon){
        _weapon = weakWeapon;
    }
    public void Attack(string victim){
        Console.WriteLine(_weapon.Hit(victim));
    }
}
Bind().To().Named(“Strong”);
绑定()到()名为(“弱”);
Weakatack类{
只读IWeapon_武器;
公共Weakatack([命名(“弱”)]IWeapon weakWeapon){
_武器=武器;
}
公共无效攻击(字符串受害者){
控制台。写线(_武器。击中(受害者));
}
}

这意味着包含
weakatack
的程序集显然必须引用Ninject才能在构造函数中使用
NamedAttribute
。依赖注入的目标不必知道使用了哪个DI容器。这里缺少什么?

一种方法是使用目标程序集中定义的自定义属性:

public class BirdAttribute : Attribute { }
public class MonkeyAttribute : Attribute { }
public interface IAnimal { }
public class Bird : IAnimal { }
public class Monkey : IAnimal { }
在构造函数参数上使用自定义属性,例如:

public class BirdCage
{
    public BirdCage([Bird]IAnimal bird) => Bird = bird;
    public IAnimal Bird { get; }
}

public class Zoo
{
    public Zoo([Monkey]IAnimal monkey, [Bird]IAnimal bird)
    {
        Monkey = monkey;
        Bird = bird;
    }

    public IAnimal Monkey { get; }
    public IAnimal Bird { get; }
}
当targethas时,绑定将使用
,如下所示:

internal class Module : NinjectModule
{
    public override void Load()
    {
        Bind<IAnimal>().To<Bird>().WhenTargetHas<BirdAttribute>();
        Bind<IAnimal>().To<Monkey>().WhenTargetHas<MonkeyAttribute>();
    }
}
内部类模块:Ninject模块
{
公共覆盖无效负载()
{
Bind().To().WhenTargetHas();
Bind().To().WhenTargetHas();
}
}
这将保持控制反转的正确方向,因为具有Ninject绑定的程序集知道目标(即自定义属性),但目标不必知道正在使用哪个IoC容器