Ninject - Как динамически выбрать реализацию для привязки к интерфейсу

В настоящее время я использую Ninject для создания экземпляров интерфейсов в приложении WCF Services.

Bind<IObjA>().To<ObjA>().InRequestScope();
Bind<IObjB>().To<ObjB>().InRequestScope();
Bind<IObjC>().To<ObjC>().InRequestScope();

Это прекрасно работает, но у нас будет несколько реализаций IObjC. Какие варианты у меня есть для продолжения плавного назначения реализации для интерфейса для IObjA/IObjB, но с возможностью настраиваемого назначения для IObjC?

Я нашел связанный вопрос по SO, но я не знаю, смогу ли я одновременно поддерживать как текучий, так и настраиваемый подход.

Например, могу ли я использовать Ninject.extensions.xml для IObjC, продолжая использовать вышеупомянутый подход для IObjA и IObjB?

Желательно ли иметь условное присвоение для IObjC? Это кажется грязным, но в то же время кажется очень простым.

if (condition1)
  Bind<IObjC>().To<ObjC1>().InRequestScope();
else if (condition 2)
  Bind<IObjC>().To<ObjC2>().InRequestScope();

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

1 ответ

Решение

1 - ваши привязки к IObjC не имеют ничего общего с другими привязками. не имеет значения, где, когда или как вы связываете другие сервисы.

2 - вы можете использовать расширения XML, но я хотел бы спросить, почему вы думаете, что вам нужно, чтобы его можно было настраивать.

3 - есть 2 варианта для вашего условия. Во-первых, вы хотите принять решение при запуске, чтобы определить, использовать ли ObjC1 для всего срока службы приложения или ObjC2. если это так, ваш код в порядке. однако, если вы хотите динамически решать, какой объект использовать каждый раз, когда вы разрешаете привязку, вам нужно поместить условие в привязку, например:

Bind<IObjC>().ToMethod( ctx => condition ? ctx.Kernel.Get<ObjC1>() : ctx.Kernel.Get<ObjC2>() );

поочередно, вы можете использовать именованные привязки:

Bind<ILog>().ToConstant( LogManager.GetLogger( "Accounting" ) ).Named( "Accounting" );

или "Когда" условия, чтобы помочь:

Bind<ILog>().ToConstant( LogManager.GetLogger( "Background" ) ).When( context => context.Target != null && context.Target.Name == "backgroundLogger" );
Другие вопросы по тегам