2013-10-26 2 views
0

я следующие привязок объявленныеNinject проблемы Условный инъекции

Bind<IDataSource>().To<DataSourceOne>(); 

Bind<ISettings>().To<DataSourceSettings> 
    .WhenInjectedInto<DataSourceOne>(); 
Bind<ISettings>().To<Settings>(); 

теперь я называю

Kernel.Get<IDataSourc>(); 

Ninject правильно впрыскивает DataSourceSettings, но мне нужно передать аргумент конструктора для настройки и DataSourceSettings, основанный на данные из файла конфигурации. поэтому я изменил IDataSouce связывания следующего

Kernel.Bind<IDataSource>().To<DataSourceOne>() 
    .WithConstructorArgument("settings", Kernel.Get<ISettings>( 
     new ConstructorArgument("data", objectContainingConfigFileData) 
    ) 
); 

в этом случае Ninject впрыскивает Настройки класса вместо класса DataSourceSettings. Я предполагаю, что проблема заключается в том, что ISettings становится разрешенным до того, как он будет введен в класс DataSourceSettings, поэтому Ninject не использует привязку, на которую я ее намеревался. Есть ли способ обойти это. Я еще ничего не нашел.

+0

Мне кажется, что у вас есть некоторая двусмысленность в вашем дизайне. 'ISettings' неоднозначен. Вместо того, чтобы усложнять время условной инъекцией, почему бы не определить два отдельных интерфейса, так как «DataSourceOne» явно ожидает чего-то другого, чем остальная система. – Steven

ответ

0

Он должен работать, если вы определяете аргумент конструктора для привязки ISettings, а не для привязки DataSource. Предполагая, что вы уже знаете объект с данными файла конфигурации в модуле. В противном случае, возможно, фабрика будет более подходящей.

kernel.Bind<IDataSource>().To<DataSourceOne>(); 
kernel.Bind<ISettings>().To<DataSourceSettings>() 
    .WhenInjectedInto<DataSourceOne>() 
    .WithConstructorArgument("data", objectContainingConfigFileData); 

kernel.Bind<ISettings>().To<Settings>(); 
+0

ну теперь я чувствую себя глупо, почему я об этом не думал. –

Смежные вопросы