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