Ninject условное связывание - PullRequest
       34

Ninject условное связывание

3 голосов
/ 06 декабря 2011

Я играю с Ninject для простого тестового проекта дома, просто чтобы посмотреть, что я могу с ним сделать.В качестве отправной точки я создаю консольный исполнитель для некоторого сервиса, который принимает различные аргументы и в зависимости от того, что получает, использует те же методы, что и для свободного интерфейса, для настройки модели для запуска.

В качестве примера, предположим, у меня есть переключатель многословия, /o./o может быть передано как /o:quiet, /o:normal или /o:verbose.Различные варианты говорят сами за себя.

Чтобы удовлетворить этот аргумент, я хотел бы присоединить различные реализации ILogger - quiet получает тихий регистратор, который печатает только критические сообщения, normal получает обычный регистратор, а verbose получаетболтливый регистратор, который печатает все.

Я хотел бы сделать что-то в модуле, например:

Bind<ILogger>().To<QuietLogger>().When(VerbosityParameter=="quiet");
Bind<ILogger>().To<VerboseLogger>().When(VerbosityParameter=="verbose");

... и т. Д.

Я не вижу, как это сделатьчто-нибудь подобное;кажется, что все условные привязки зависят от состояния объекта инъекции.Какой в ​​этом смысл?Разве это не разрушает всю точку внедрения зависимости, когда потребляющий класс должен точно определить все условия, необходимые для определения того, какой конкретный тип он получает?Почему я не могу просто сказать Ninject, что я хочу, и получить это?

Ответы [ 2 ]

3 голосов
/ 06 декабря 2011

В этом особом случае я бы не стал заменять экземпляр средства ведения журнала, а настроил бы свою среду ведения журнала так, чтобы регистрировать именно то, что вы хотите.

Кроме того, условие When не зависит от цели, которую вы можете установитьтам какие-то условия.Например,

When(ctx => Configuration.Get("VerborsityLevel") == "quiet")
3 голосов
/ 06 декабря 2011

Параметр ctx - это всего лишь один вход в контекстную привязку - ничто не говорит о том, что вам нужно уделять ему хоть немного внимания (за исключением того, что вы должны быть совместимы с сигнатурой делегата) .

Имейте в виду шаблон RRR , хотя и не сходите с ума.

IOW вам нужно быть (в синтаксисе V2 это делается):

Bind<IWarrior>().To<Samurai>().When(_ => expression not involving context at all);

(где _ - это использование pidgin для бедного человека синтаксиса соответствия шаблону F # для игнорирования входных данных)

...