Передать позиционные аргументы конструктору в Ninject

Используя 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;
    }
}

person bavaza    schedule 27.01.2014    source источник
comment
Можете ли вы опубликовать образец ConcreteService? В чем проблема с использованием имени аргумента? Почему вы хотите связать на основе позиции?   -  person nemesv    schedule 27.01.2014
comment
Почему бы вам не зарегистрировать свой ISettings в самом контейнере. Таким образом, Ninject автоматически разрешит это для вас: kernel.Bind<ISetting>().ToConstant(mySettings);IService service = kernel.Get<IService>() }); если вы не хотите использовать эту настройку my в каждом Iservice, вы можете использовать параметр конфигурации WhenInjectedInto, чтобы ограничить, куда вводить настройки по умолчанию.   -  person nemesv    schedule 27.01.2014
comment
@memesv - в итоге я сделал что-то похожее на то, что вы предложили. Однако ради завершения возможно ли вводить во время разрешения, используя позиционные аргументы?   -  person bavaza    schedule 27.01.2014
comment
Нет, позиционное внедрение аргументов не поддерживается из коробки. Однако вы можете создать свою собственную реализацию IConstructorArgument, где вы можете реализовать внедрение аргументов на основе позиции.   -  person nemesv    schedule 27.01.2014


Ответы (1)


Нет, вам придется обойти это, используя привязки как ToProvider, абстрактные фабрики или контекстные привязки для каждой комбинации перегрузок с использованием позиционных параметров, таких как:

Bind<IService>().To<MyService>().WithConstructorArgument(...).Named(...)
Bind<IService>().To<MyService>().WithConstructorArgument(...).WhenInjectedInto(...)
person cvbarros    schedule 27.01.2014