Используя Ninject 3.0, я знаю, что могу передавать аргументы конструктору конкретной службы во время разрешения следующим образом:
IKernel kernel = new StandardKernel();
kernel.Bind<IService>.To<ConcreteService>();
MySettings mySettings = new DefaultConcreteServiceSettings();
IService service = kernel.Get<IService>(new[] { new ConstructorArgument("settings", mySettings) });
Объект ConstructorArgument
принимает два параметра: первый — это имя переопределяемого аргумента, а второй — его внедренное значение.
Можно ли внедрить конструктор mySettings
в IService
на основе его положения в посадочном месте конструктора, а не формального имени параметра?
ИЗМЕНИТЬ
По просьбе @nemesv я добавляю пример кода для ConcreteService
. Моя мотивация основана на том, что в зависимости от имени аргумента для каждой конкретной реализации IService
код становится хрупким:
public class ConcreteService : IService
{
readonly ISettings _settings;
public ConcreteService(ISettings settings)
{
_settings = settings;
}
}
public class ConcreteServiceBySomePoorGuyWhoCantSpell : IService
{
readonly ISettings _settings;
public ConcreteServiceBySomePoorGuyWhoCantSpell(ISettings suttingz)
{
_settings = suttingz;
}
}
ConcreteService
? В чем проблема с использованием имени аргумента? Почему вы хотите связать на основе позиции? - person nemesv   schedule 27.01.2014ISettings
в самом контейнере. Таким образом, Ninject автоматически разрешит это для вас:kernel.Bind<ISetting>().ToConstant(mySettings);IService service = kernel.Get<IService>() });
если вы не хотите использовать эту настройку my в каждом Iservice, вы можете использовать параметр конфигурацииWhenInjectedInto
, чтобы ограничить, куда вводить настройки по умолчанию. - person nemesv   schedule 27.01.2014IConstructorArgument
, где вы можете реализовать внедрение аргументов на основе позиции. - person nemesv   schedule 27.01.2014