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容器