Ho bisogno di aggiungere alcuni punti di estensione al nostro codice esistente, e ho cercato MEF come una possibile soluzione. Abbiamo un'interfaccia IRandomNumberGenerator, con un'implementazione predefinita (ConcreteRNG) che vorremmo poter essere scambiati. Questo suona come uno scenario ideale per MEF, ma ho avuto problemi con il modo in cui istanziamo i generatori di numeri casuali. Il nostro codice attuale assomiglia:Posso controllare la creazione dell'oggetto tramite MEF?
public class Consumer
{
private List<IRandomNumberGenerator> generators;
private List<double> seeds;
public Consumer()
{
generators = new List<IRandomNumberGenerator>();
seeds = new List<double>(new[] {1.0, 2.0, 3.0});
foreach(var seed in seeds)
{
generators.Add(new ConcreteRNG(seed));
}
}
}
In altre parole, il consumatore è responsabile per istanziare i RNG di cui ha bisogno, tra cui fornire il seme che ogni istanza richiede.
Quello che mi piacerebbe fare è scoprire l'implementazione concreta di RNG e l'istanza di MEF (usando DirectoryCatalog). Non sono sicuro di come farlo. Potrei esporre una proprietà di Generators e contrassegnarla come [Import], ma come posso fornire i semi richiesti?
C'è qualche altro approccio che mi manca?
Grazie Wes. Avevo preso in considerazione un approccio di fabbrica, ma ero rimasto bloccato a causa del fatto che volevo uno stabilimento generico in grado di creare un'istanza di qualsiasi tipo di IRandomNumberGenerator scoperto da MEF. Ripensandoci, il tuo approccio non sembra molto di più, grazie ancora. – Akash
Ora funziona. L'ho semplificato un po 'fornendo un metodo factory statico su ConcreteRNG: [Esporta (typeof (Func))] public static solo in lettura Func Create = seed => new ConcreteRNG (seed) ; –
Akash
Sì, esportare una funzione è anche un altro modo semplificato per ottenere ciò che si desidera. Inoltre, mi sono appena reso conto che se si desidera utilizzare quell'importazione all'interno del costruttore, sarà necessario importarlo come costruttore, poiché l'importazione come dimostrata non sarebbe stata impostata prima della costruzione dell'oggetto. –