2010-09-18 17 views
5

Sono abbastanza nuovo per Ninject, ma sono riusciti con successo ad usarlo per DI utilizzando un provider personalizzato.Ninject, fornitori e Activator.CreateInstance

Il legame viene inizializzata come segue

kernel = new StandardKernel(); 

kernel.Bind<IPatientRecordLocator>().ToProvider<PatientRecordLocatorProvider>(); 

e nel provider personalizzato io chiamo Activator.CreateInstance in questo modo

protected override IPatientRecordLocator CreateInstance(IContext context) 
{ 
    var name = ConfigurationManager.AppSettings["PatientRecordLocator"]; 
    var typeName = name.Split(',')[0]; 
    var assemblyName = name.Split(',')[1]; 
    return Activator.CreateInstance(assemblyName, typeName).Unwrap() as IPatientRecordLocator; 
} 

(sì, sono consapevole del fatto che non v'è alcuna gestione degli errori, ecc . nel codice sopra :))

e tutto questo funziona come un fascino.

Ora, il problema che sto affrontando è quando presento una nuova classe che desidero iniettare in casi di IPatientRecordLocator. Il problema si verifica quando aggiungo un costruttore come il seguente ad es. una di queste classi

[Inject] 
public MockPatientRecordLocator (IContactAdapter contactAdapter) 
{ 
    ... 
} 

Poi, per Activator.CreateInstance per lavorare devo anche aggiungere un costruttore senza parametri alla classe MockPatientRecordLocator, cioè

public MockPatientRecordLocator() 
{ 
} 

Quindi, la mia domanda è: come posso fare Ninject iniettare un'istanza di una classe che implementa IContactAdapter in es MockPatientRecordLocator? Ho provato l'iniezione del metodo, ma senza risultato.

Ho dimenticato di spiegare che quello che sto cercando di ottenere è una sorta di iniezione concatenata in cui un'istanza di classe PatientRecordSummary viene iniettata con un'istanza di MockPatientRecordLocator (utilizzando l'iniezione del costruttore) e l'istanza di MockPatientRecordLocator deve essere iniettata con un istanza di IContactAdapter (ancora usando l'iniezione del costruttore (se possibile)). La prima parte della catena funziona, la seconda no.

risposta

1

Non male per una prima domanda!

Si desidera utilizzare il Bind(Type) di sovraccarico per consentire la registrazione di roba che non avete staticamente disponibili nel contesto del codice Load() - fare le cose che si sta facendo nel vostro provider (ad esempio, la risoluzione del Type) up-front . Ciò consentirà a Ninject di eseguire l'istanziazione degli oggetti (senza alcun requisito per un .ctor predefinito)

IIRC two or 3 of my most recent answers anche toccare questa scoperta/caricamento e avere esempi che dovrebbero essere rilevanti per il tuo caso.

(e voi non c'è bisogno di ricorrere a [Inject] attributi quando hai ottenuto per rimuovere le cose)

+0

Ciao Ruben, grazie per il vostro aiuto (e complimenti). Provando il meglio che posso :-) In questa particolare configurazione non ho usato i moduli, ma passerò a usarli in modo da poter usare più facilmente Bind(). – norgie