我使用ninject通过MVVM方法在WPF项目中注入我的依赖项。
我创建了UserControl
来显示Grid中的数据,并包含一个按钮。
在按钮上单击Grid中的每个记录都由Ninject注入的IChecker
实现进行检查。问题是,我正在使用此UserControl
的两个实例,其中ViewModel
的两个实例绑定到DataContext
。
我想将IChecker
的不同实现传递给相同类型ViewModel
的不同实例。如何使用Ninject实现这一目标?
答案 0 :(得分:0)
您有多个选项,如Ninject Contextual Binding documentation
中所指定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
。