2014-09-04 22 views
12

Sto utilizzando lo Ninject come contenitore IoC ma non è in grado di capire come creare un'istanza di una classe che ha più di 1 parametro nel costruttore. Fondamentalmente ho un'interfaccia di servizio per l'autenticazione in una biblioteca PCL e la sua attuazione in un progetto WP8 che riceve nel costruttore della chiave cosumer, segreta e BaseAddress:Costruttore con più argomenti con 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() { ... } 
} 

Ora ho bisogno di configurare il modulo Ninject modo da poter ottenere un'istanza di IAuthorizationService. Se la mia classe non aveva costruttori che vorrei fare:

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

Se fosse valori fissi per il costruttore che vorrei fare:

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

E per ottenere un'istanza Module.Get<IAuthorizationService>()

Ma cosa se i parametri del costruttore non possono essere risolti al momento della compilazione? Come passare i paramenters? Come dovrebbe essere il codice bind?

Modificato per eliminare la domanda.

+0

Perché il downvote? dovrebbe avere almeno commentato in modo da poter cambiare la domanda ... –

+0

è probabilmente perché hanno ritenuto che questa domanda è facilmente risposta guardando i documenti: https://github.com/ninject/ninject/wiki/Dependency-Injection- With-Ninject – BatteryBackupUnit

+0

No, non lo è! Se guardi i documenti tutti i parametri del costruttore sono anch'essi "iniettabili". Il mio costruttore ha i parametri delle stringhe. –

risposta

10

È molto semplice. Non importa quanti argomenti del costruttore, l'associazione rimane la stessa:

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

Diciamo MyAuthenticator avuto un costruttore con un parametro di tipo IFoo. Tutto quello che devi fare è dire a ninject come può risolvere/creare uno IFoo. Anche in questo caso, molto semplice:

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

Non è necessario WithConstructorArgument mai, salvo nel caso in cui si desidera ignorare il comportamento predefinito di Ninject. Diciamo che MyAuthenticator ha un parametro di tipo IFoo più un altro parametro string seed che si desidera configurare in modo specifico. Tutto quello che avreste bisogno è:

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

non c'è bisogno di specificare il valore del parametro IFoo!

+1

Questo è il problema, il mio costruttore ha parametri di stringa e non conosco il loro valore su Bind time. –

+0

Da dove vengono ricavati i valori dei parametri di stringa? Penso che potresti aver bisogno di una fabbrica. Perché non passi questi parametri di stringa come argomento al metodo 'Authenticate()'? – BatteryBackupUnit

+0

2 di questi sono dai file di configurazione quindi ho passato quindi con il metodo'WithConstructorArgument() '. L'altro dipende dall'input dell'utente. –