2013-04-10 21 views
5

Diese Frage wurde anscheinend mehrmals gestellt, aber ich habe noch keine Antwort gefunden, die tatsächlich funktioniert. Ganz einfach, wie entferne ich etwas aus einem MEF-Container.Entfernen aus dem MEF-Container

Selbst der Code hier https://mef.codeplex.com/wikipage?title=Parts%20Lifetime unter AddPart/RemovePart funktioniert nicht, da es nicht kompiliert wird, wie es aufgeführt ist. Der Code zeigt dies:

var catalog = new AssemblyCatalog(typeof(Program).Assembly); 
    var container = new CompositionContainer(catalog); 
    var root = new Root(); 

    // add external part 
    container.ComposeParts(root); 

    // ... use the composed root instance 

    // removes external part 
    batch = new CompositionBatch(); 
    batch.RemovePart(root); 
    container.Compose(batch); 

Dies wird nicht kompiliert, da der Aufruf von RemovePart eine ComposablePart erfordert die Wurzel ist eindeutig nicht. Andere einfache Beispiele zeigen, wie das Teil erstellt und das Teil entfernt wird, aber ein Verweis auf das erstellte Teil (als ComposablePart) beibehalten wird, sodass das Entfernen nur diesen Verweis verwendet. Ich möchte keinen Verweis auf jedes Teil im Container behalten, wenn sie erstellt werden. Ich möchte nur ein Teil aus dem Container an einem beliebigen Punkt in meiner Anwendung entfernen, ohne einen Verweis darauf zu behalten. Hier

ist das, was ich versuche, genau die gleiche Muster in der Dokumentation aufgeführt zu tun mit oben verlinkten:

public class Program 
{ 
    [Import] 
    private IClass myClass; 

    public Program() 
    { 
     var container = new CompositionContainer(new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     container.ComposeParts(this); 

     var partToRemove = container.GetExport<IClass>(); 

     var batch = new CompositionBatch(); 
     batch.RemovePart(partToRemove); 
     container.Compose(batch); 
    } 

    public static void Main(string[] args) 
    { 
     var program = new Program(); 
    } 
} 

Aber das gibt mir die folgenden Kompilierungsfehler:

Argument 1: cannot convert from 'System.Lazy' to 'System.ComponentModel.Composition.Primitives.ComposablePart' C:\Users\irbldr.CORP\Documents\Visual Studio 2012\Projects\ConsoleApplication4\Program.cs

das genau ist, Den gleichen Fehler erhalte ich, wenn ich den Code direkt aus der oben verlinkten Dokumentation verwende.

Gibt es keine Möglichkeit, einfach etwas aus dem MEF-Container zu entfernen?

+0

Wahr, das war eine Sackgasse. Es tut uns leid. – Marc

+0

Was ist mit den Überladungen CompositionContainer.ReleaseExport und ReleaseExports? –

+0

ReleaseExport (s) ruft IDisposable nur auf dem Teil auf. Wenn das Teil IDisposable nicht implementiert, wird nichts ausgeführt und der Container bleibt nach dem Aufruf unverändert. – meyousikmann

Antwort

0

könnte diesen Link hilfreich sein: How do I get MEF to recompose when I change a part?

Aber lange Geschichte kurz: Sie MEF eine Instanz entfernen können, aber Sie können eine Exportdefinition nicht entfernen, ohne den kompletten Katalog löschen, neu zusammenstellen und filtern (einfach nicht hinzufügen etwas).

Verwandte Themen