Erstellen mehrerer Instanzen der Importierten MEF Teile
Derzeit meine WPF-Anwendung importiert einen Teil wie diesen
[Import(typeof(ILedPanel)]
public ILedPanel Panel { get; set; }
Aber das gibt ma a single Herzen lag, von der Klasse, die ILedPanel.
Was ich wirklich tun wollen ist, die Fähigkeit haben, erstellen Sie so viele Instanzen
dass ich brauche. Bitte beachten Sie, es gibt nur einen Export für ILedPanel enthalten
mit der software zu einem bestimmten Zeitpunkt.
(Wenn ich eine import-Liste mit, dass ich eine Instanz
für jede Klasse die ILedPanel)
Irgendwelche Vorschläge?
- Ich bin nicht sicher, es ist ein guter Weg, aber ich ging einfach mit Aktivator.CreateInstance(Panel.GetType());
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es nicht das "eingebaute" Unterstützung für diese in MEF-heute, aber vor der Rückkehr zu Service Locator, finden Sie vielleicht einige Inspirationen hier: http://blogs.msdn.com/nblumhardt/archive/2008/12/27/container-managed-application-design-prelude-where-does-the-container-belong.aspx
Die grundlegende Idee ist, dass Sie 'import' - container der Komponente, muss die dynamische Instanziierung.
Mehr direkte Unterstützung für dieses Szenario ist etwas, was wir erforschen.
Nick
UPDATE: MEF hat nun experimentelle Unterstützung für diese. Sehen in diesem blog-post für weitere Informationen.
Ich bin mir nicht sicher, ob dies ist es, was Nicolas meint, aber man könnte den import einer Factory-Klasse statt einer Instanz der Klasse, wie dieser:
...und dann später im code...
Alle anderen Antworten sind ziemlich alt, so dass Sie nicht erwähnen, eine relativ neue Funktion in MEF genannt
ExportFactory
. Diese generische Klasse können Sie den import derExportFactory<ILedPanel>
und erstellen Sie so viele Instanzen, wie Sie möchten, Wann immer Sie Sie brauchen, so würde der code wie folgt Aussehen:Diese Methode erfüllt auch alle Importe, die Teil erstellt hat. Lesen Sie mehr über die Verwendung der
ExportFactory
Klasse hier.Sofern ich nicht falsch verstehen die Frage, es sieht aus, als wäre es gelöst, indem Sie einfach mit einem CreationPolicy.Nicht freigegeben.
Dies setzt Voraus, dass der code der Deklaration der Systemsteuerung gibt es überall Sie wollen ein panel. Sie würden eine neue Instanz von ILedPanel in jeder Instanz von jeder Klasse, die hatte diese Erklärung (das importieren).
Blick auf die Formen-Spiel-Beispiel, das kommt mit MEF, es ist die ShapeFactory Klasse:
Welche veranschaulicht das erstellen eines zufälligen Form-Instanzen "auf Nachfrage"... ich denke, in Ihrem Szenario, das Sie könnte etwas ähnliches machen, ohne die Auswahl einer random-Implementierung, wie Sie vorschlagen, es wäre nur eine Umsetzung ILedPanel registriert.
ich denke du meinst Sie verwenden möchten, MEF in diesem Fall wie ein service-locator eher als ein dependency injection container. Versuchen Sie Beispiele für ValueResolver