Frage

Ich bin ein bisschen verloren mit MEF, MAF, Einheit ...

In dieser Frage handelt es sich um die Architektur der Winform -Anwendung.

Ich habe ein Hauptprojekt, das eine Hauptform und einige andere Formen enthält.

Weil ich einbeziehen möchte Modularität, Ich denke darüber nach, ein Plugin -System zu verwenden.

Was ich gerne tun würde ist Öffnen Sie jede Plugin -DLL Wenn die Hauptanwendung geöffnet wird, um jeweils mit der Schaltfläche zu verweisen, wird die Symbolleiste ...

Dann würde ich gerne gerne entsorgen sie bis sie gerufen werden.

Aber ich möchte nicht, dass alle Plugins im Gedächtnis gehalten werden. Nur um ein gutes Architekturmodell zu bekommen.

Also zuerst über .Net: Hält Dotnet nur a Hinweis an die DLL -Plugins im Speicher oder in allem Der Plugin -Code ?

Ich denke daran, MEF mit zu benutzen LAZY Sammlung von Import, aber ich muss sie zuerst instanziieren, um meine Schaltflächen zu erhalten. Also zweite Frage

Wenn ich die Import -Sammlung auf festlegt null und lauch der compose() Funktionieren Sie erneut, die Plugins werden geladen oder warten, bis der Anruf geladen wird (faul)?

War es hilfreich?

Lösung

Dann möchte ich sie entsorgen, bis sie gerufen werden.

Anstatt importierte Objekte zu inspizieren und dann wegzuwerfen, sollten Sie den Import überprüfen Metadaten. Sie können diese Metadaten durch Importieren erhalten Lazy<IFoo,IFooMetadata> oder Lazy<IFoo,Dictionary<string,object>>. Sie können diese Metadaten zum Export mit dem hinzufügen ExportMetadata Attribut.

Also zuerst über .NET: Hält DOTNET nur einen Verweis auf die DLL -Plugins im Speicher oder den gesamten Plugin -Code?

Sobald eine Baugruppe geladen ist, bleibt sie im Speicher, es sei denn, Sie entladen die gesamte Appdomain.

Außerdem gibt es keine außergewöhnlichen Implementierungen von ComposablePartCatalog in .NET 4.0, das ohne Laden der entsprechenden Baugruppe abfragt werden kann. Aber theoretisch könnte so etwas getan werden, wenn Sie die Metadaten irgendwo außerhalb der Versammlung aufbewahren. Es gibt eine Stichprobe einer solchen Implementierung in der MEF -Code auf Codeplex.

Ich denke daran, MEF mit fauler Sammlung von Import zu verwenden

Die Verwendung von faulen Importen verhindert nicht unbedingt, dass Baugruppen geladen werden. Wenn Sie einen Verweis auf a haben Lazy<IFoo> Objekt, dann zumindest die Baugruppe, die enthält IFoo muss geladen werden. Und wie ich oben erklärte, enthielt die Baugruppe, die den Export enthält IFoo Die Implementierung wird zu diesem Zeitpunkt ebenfalls geladen worden.

Die Verwendung von Lazy verschiebt nur die Aufruf einiger Konstrukteure, was hoffentlich zu einem schnelleren Start Ihrer Anwendung führt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top