Конструктор с несколькими аргументами с Ninject
Я пытаюсь использовать Ninject как контейнер IoC, но не мог понять, как создать экземпляр класса с более чем одним параметром в конструкторе, В основном у меня есть служебный интерфейс для проверки подлинности в библиотеке PCL и его реализация в проекте WP8, который получает в конструкторе ключ cosumer, secret и baseAddress:
//On PCL project
public interface IAuthorizationService {
bool Authenticate();
}
//On WP8 Project
pubilc class MyAuthenticator : IAuthorizationService {
public MyAuthenticator(string consumerKey, string consumerSecret, string baseAddress) { ... }
public bool Authenticate() { ... }
}
Теперь мне нужно настроить Ninject, чтобы я мог получить экземпляр IAuthorizationService.
Если бы у моего класса не было конструкторов, я бы сделал:
internal class Module : NinjectModule {
public override void Load() {
this.Bind<IAuthorizationService>().To<MyAuthenticator>();
}
}
Если бы у него были фиксированные значения для конструктора, я бы сделал:
internal class Module : NinjectModule {
public override void Load() {
this.Bind<IAuthorizationService>().To<MyAuthenticator>().WithConstructorArgument( */* fixed argument here*/* );
}
}
И чтобы получить экземпляр Module.Get<IAuthorizationService>()
Но что, если параметры конструктора не могут быть разрешены во время компиляции? Как пройти паразиты? Как должен быть код привязки?
Отредактировано для уточнения вопроса.
Ответы
Ответ 1
Это очень легко. Независимо от того, сколько аргументов конструктора привязка остается неизменной:
Bind<IAuthorizationService>().To<MyAuthenticator>();
Скажем, MyAuthenticator
имел конструктор с одним параметром типа IFoo
.
Все, что вам нужно сделать, это указать ninject, как он может разрешить/создать IFoo
. Опять же, очень просто:
Bind<IFoo>().To<Foo>();
Вам не нужно WithConstructorArgument
когда-либо, за исключением случаев, когда вы хотите переопределить поведение ninject по умолчанию. Пусть say MyAuthenticator
имеет параметр типа IFoo
плюс еще один параметр string seed
, который вы хотите настроить конкретно. Все, что вам нужно, это:
Bind<IFoo>().To<Foo>();
Bind<IAuthorizationService>().To<MyAuthenticator>()
.WithConstructorArgument("seed", "initialSeedValue");
нет необходимости указывать значение параметра IFoo
!