2014-09-04 6 views
12

Я использую Ninject как контейнер IoC, но не мог понять, как создать экземпляр класса с более чем одним параметром в конструкторе. В принципе у меня есть интерфейс службы для проверки подлинности в PCL библиотеки и ее реализация в WP8 проекте, который принимает в конструкторе ключ cosumer, секретный и BaseAddress:Конструктор с несколькими аргументами с Ninject

//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>()

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

Отредактировано claryfy вопрос.

+0

Почему downvote? должен был хотя бы прокомментировать, чтобы я мог изменить вопрос ... –

+0

, вероятно, потому, что они чувствовали, что на этот вопрос легко ответить, посмотрев на документы: https://github.com/ninject/ninject/wiki/Dependency-Injection- With-Ninject – BatteryBackupUnit

+0

Нет, это не так! Если вы посмотрите на документы, все параметры конструктора также «вводят». Мой конструктор имеет параметры строк. –

ответ

10

Это очень просто. Независимо от того, сколько аргументов конструктора, связывающая не остается неизменным:

Bind<IAuthorizationService>().To<MyAuthenticator>(); 

Допустим MyAuthenticator был конструктор с одним параметром типа IFoo. Все, что вам нужно сделать, это сказать ninject, как он может разрешить/создать IFoo. Опять же, очень просто:

Bind<IFoo>().To<Foo>(); 

Вам не нужно WithConstructorArgument когда-либо, кроме в случае, если вы хотите изменить поведение по умолчанию Ninject. Скажем, MyAuthenticator имеет параметр типа IFoo плюс еще один параметр string seed, который вы хотите настроить конкретно. Все, что вам понадобится это:

Bind<IFoo>().To<Foo>(); 
Bind<IAuthorizationService>().To<MyAuthenticator>() 
    .WithConstructorArgument("seed", "initialSeedValue"); 

нет необходимости указывать значение параметра IFoo!

+1

В этом проблема, мой конструктор имеет строковые параметры, и я не знаю их значения во время Bind. –

+0

Откуда вы берете значения параметров строки? Я считаю, что вам может понадобиться фабрика. Почему бы вам не передать эти параметры строки в качестве аргумента в метод 'Authenticate()'? – BatteryBackupUnit

+0

2 из файлов конфигурации, поэтому я передал метод'WithConstructorArgument(). Другая зависит от пользовательского ввода. –