2014-09-04 40 views
12

Tring używać Ninject jako kontener IoC, ale nie może zrozumieć, jak utworzyć wystąpienie klasy, która ma więcej niż 1 parametr w konstruktorze. Zasadniczo mam interfejs usługi uwierzytelniania w bibliotece PCL i jego wdrożenie w projekcie WP8, który odbiera w konstruktorze klawisz cosumer, tajne i baseAddress:Konstruktor z wieloma argumentami z 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() { ... } 
} 

Teraz trzeba skonfigurować moduł Ninject więc mogę dostać instancja IAuthorizationService. Jeśli moja klasa miała żadnych konstruktorów zrobiłbym:

internal class Module : NinjectModule { 
public override void Load() { 
    this.Bind<IAuthorizationService>().To<MyAuthenticator>(); 
} 
} 

Gdyby stałe wartości dla konstruktora zrobiłbym:

internal class Module : NinjectModule { 
public override void Load() { 
    this.Bind<IAuthorizationService>().To<MyAuthenticator>().WithConstructorArgument(*/* fixed argument here*/*); 
} 
} 

i uzyskać instancji Module.Get<IAuthorizationService>()

Ale co czy parametrów konstruktora nie można rozwiązać w czasie kompilacji? Jak przekazać paramenty? Jak powinien wyglądać kod wiążący?

Edytowane w celu wyjaśnienia pytania.

+0

Dlaczego spadamy? powinienem przynajmniej skomentować, aby móc zmienić pytanie ... –

+0

Prawdopodobnie dlatego, że czuli, że na to pytanie można łatwo odpowiedzieć, patrząc na dokumenty: https://github.com/ninject/ninject/wiki/Dependency-Injection- With-Ninject – BatteryBackupUnit

+0

Nie, nie jest! Jeśli spojrzysz na dokumenty, wszystkie parametry konstruktora są również "wstrzykiwane". Mój konstruktor ma parametry łańcuchów. –

Odpowiedz

10

To bardzo proste. Bez względu na to jak wiele argumentów konstruktora, wiązanie pozostaje taka sama:

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

Powiedzmy MyAuthenticator miał konstruktor z jednym parametrem typu IFoo. Wszystko, co musisz zrobić, to powiedzieć ninject, jak to rozwiązać/stworzyć IFoo. Ponownie bardzo proste:

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

Nie trzeba WithConstructorArgument kiedykolwiek wyjątkiem w przypadku, gdy chcesz nadpisać domyślne zachowanie ninject. Powiedzmy, że MyAuthenticator ma parametr typu IFoo oraz inny parametr string seed, który chcesz skonfigurować specjalnie. Wszystko co potrzebne jest by:

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

ma potrzeby, aby określić wartość parametru IFoo!

+1

To jest problem, mój konstruktor ma parametry łańcuchowe i nie znam ich wartości w czasie wiązania. –

+0

Skąd pochodzą wartości parametrów łańcucha? Sądzę, że możesz potrzebować fabryki. Dlaczego nie przekazujesz tych parametrów ciągu jako argumentu do metody 'Authenticate()'? – BatteryBackupUnit

+0

2 z nich są z plików konfiguracyjnych, więc przekazałem wtedy metodę "WithConstructorArgument()". Drugi zależy od danych wprowadzanych przez użytkownika. –