Ich muss einige Erweiterungspunkte zu unserem bestehenden Code hinzufügen, und ich habe MEF als eine mögliche Lösung betrachtet. Wir haben eine IRandomNumberGenerator-Schnittstelle mit einer Standardimplementierung (ConcreteRNG), die wir gerne austauschen würden. Das klingt nach einem idealen Szenario für MEF, aber ich habe Probleme mit der Instanziierung der Zufallsgeneratoren. Unsere aktuellen Code wie folgt aussehen:Kann ich die Erstellung von Objekten mithilfe von MEF steuern?
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));
}
}
}
Mit anderen Worten, die Verbraucher zum Instanziieren der RNGs verantwortlich ist es braucht, einschließlich der Bereitstellung von den Samen, die jede Instanz erfordert.
Was ich tun möchte, ist die konkrete RNG-Implementierung von MEF entdeckt und instanziiert (mit dem DirectoryCatalog). Ich bin mir nicht sicher, wie ich das erreichen soll. Ich könnte eine Generators-Eigenschaft verfügbar machen und sie als [Import] markieren, aber wie stelle ich die erforderlichen Seeds bereit?
Gibt es einen anderen Ansatz, den ich vermisse?
Danke Wes. Ich hatte einen Fabrikansatz in Betracht gezogen, war aber wegen der Tatsache, dass ich eine generische Fabrik haben wollte, die eine Instanz des Typs IRandomNumberGenerator erstellen würde, der von MEF entdeckt wurde, hängengeblieben. Wenn Sie noch einmal darüber nachdenken, scheint Ihre Herangehensweise nicht viel zusätzliche Arbeit zu sein - nochmals vielen Dank. – Akash
Ich habe das jetzt funktioniert. Ich kann es vereinfacht ein wenig durch eine statische Factory-Methode auf ConcreteRNG Bereitstellung: [Export (typeof (Func))] public static Nur-Lese-Func Create = seed => new ConcreteRNG (Samen) ; –
Akash
Ja exportieren Sie eine Funktion selbst ist auch eine andere vereinfachte Möglichkeit, um zu bekommen, was Sie wollen. Ich habe auch festgestellt, dass Sie, wenn Sie diesen Import im Konstruktor verwenden möchten, einen Konstruktorimport durchführen müssen, da dieser Import, wie ich gezeigt habe, nicht vor der Konstruktion des Objekts gesetzt wird. –