使用ninject绑定相同接口的不同实现

时间:2018-06-06 08:32:35

标签: c# wpf ninject

我使用ninject通过MVVM方法在WPF项目中注入我的依赖项。 我创建了UserControl来显示Grid中的数据,并包含一个按钮。 在按钮上单击Grid中的每个记录都由Ninject注入的IChecker实现进行检查。问题是,我正在使用此UserControl的两个实例,其中ViewModel的两个实例绑定到DataContext。 我想将IChecker的不同实现传递给相同类型ViewModel的不同实例。如何使用Ninject实现这一目标?

1 个答案:

答案 0 :(得分:0)

您有多个选项,如Ninject Contextual Binding documentation

中所指定

Ninject WhenXXX

可用的一些现成的Contextual Bindings是:

    Bind<IWarrior>().To<Ninja>();
    Bind<IWarrior>().To<Samurai>().WhenClassHas<ClimberNeeded>();
    Bind<IWarrior>().To<Samurai>().WhenTargetHas<ClimberNeeded>();
    Bind<IWarrior>().To<SpecialNinja>().WhenMemberHas<SwimmerNeeded>();
    Bind<IWarrior>().To<Samurai>().WhenInjectedInto(typeof(OnLandAttack));
    Bind<IWarrior>().To<SpecialNinja>().WhenInjectedInto(typeof(AmphibiousAttack));

或者您可以提供谓词并使用Target tinfo的自定义逻辑:

Bind<IWarrior>().To<Samurai>().When(request => request.Target.Member.Name.StartsWith("Climbing"));
Bind<IWarrior>().To<Samurai>().When(request => request.Target.Type.Namespace.StartsWith("Samurais.Climbing"));

自定义工厂

如果你的逻辑开始变得复杂,决定何时注入什么,你可能想要实现某种ICheckerFactory,它将根据一些参数知道要创建哪个IChecker