J'ai besoin d'ajouter des points d'extension à notre code existant, et j'ai envisagé MEF comme une solution possible. Nous avons une interface IRandomNumberGenerator, avec une implémentation par défaut (ConcreteRNG) que nous aimerions pouvoir échanger. Cela ressemble à un scénario idéal pour MEF, mais j'ai eu des problèmes avec la façon dont nous instancions les générateurs de nombres aléatoires. Notre code actuel ressemble à:Puis-je contrôler la création d'objets en utilisant 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));
}
}
}
En d'autres termes, le consommateur est responsable de l'instanciation les RNG dont elle a besoin, notamment en fournissant la semence que chaque instance exige.
Ce que je voudrais faire, c'est que l'implémentation concrète de RNG soit découverte et instanciée par MEF (en utilisant DirectoryCatalog). Je ne suis pas sûr de savoir comment y parvenir. Je pourrais exposer une propriété Generators et la marquer comme [Import], mais comment puis-je fournir les graines requises?
Y at-il une autre approche qui me manque?
Merci Wes. J'avais envisagé une approche d'usine, mais je me suis retrouvé coincé parce que je voulais une usine générique qui créerait une instance de n'importe quel type IRandomNumberGenerator a été découvert par MEF. En y repensant, votre approche ne semble pas beaucoup de travail supplémentaire - merci encore. – Akash
Je travaille maintenant. Je l'ai simplifié un peu en fournissant une méthode d'usine statique sur ConcreteRNG: [Export (typeof (Func))] public static readonly Func Create = graine => new ConcreteRNG (graine) ; –
Akash
Oui exporter une fonction elle-même est également un autre moyen simplifié d'obtenir ce que vous voulez. De plus, je viens de réaliser que si vous voulez utiliser cette importation dans le constructeur, vous devrez en faire une importation de constructeur, parce que cette importation, comme je l'ai démontré, ne sera pas définie avant la construction de l'objet. –