Ninject - Как динамически выбрать реализацию для привязки к интерфейсу - PullRequest
3 голосов
/ 05 января 2011

В настоящее время я использую 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 Ответ

5 голосов
/ 05 января 2011

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