Подтвердить что ты не робот

Конструктор с несколькими аргументами с 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>()

Но что, если параметры конструктора не могут быть разрешены во время компиляции? Как пройти паразиты? Как должен быть код привязки?

Отредактировано для уточнения вопроса.

4b9b3361

Ответ 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!