Свяжите разные реализации одного и того же интерфейса, используя ninject - PullRequest
0 голосов
/ 06 июня 2018

Я использую ninject для внедрения своих зависимостей в проект WPF с подходом MVVM.Я создал UserControl, который показывает данные в сетке, и содержит кнопку.При нажатии кнопки каждая запись в Grid проверяется моей реализацией IChecker, введенной Ninject.Проблема в том, что я использую два экземпляра этого UserControl с двумя экземплярами ViewModel, связанными с DataContext.Я хочу передать различные реализации моих IChecker различным экземплярам того же типа ViewModel.Как мне этого добиться с помощью Ninject?

1 Ответ

0 голосов
/ 06 июня 2018

У вас есть несколько опций, как указано в Ninject Документация по привязке к контексту

Ninject WhenXXX

Доступны некоторые из стандартных доступных контекстных привязок:

    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));

Или вы можете предоставить предикат и использовать настраиваемую логику с помощью целевого окна:

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 создать, основываясь на некоторых параметрах.

...