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.
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