C# .NET 4.0 Forms Plugins Manager formuliert
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)?
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.