2013-04-10 14 views
5

To pytanie pojawiło się kilka razy, ale jeszcze nie znalazłem odpowiedzi, która faktycznie działa. Po prostu, jak usunąć coś z kontenera MEF.Usuwanie z kontenera MEF

Nawet kod tutaj pokazany https://mef.codeplex.com/wikipage?title=Parts%20Lifetime pod AddPart/RemovePart nie działa, ponieważ nie będzie się kompilował, tak jak jest na liście. Kod pokazuje to:

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); 

Nie będzie to skompilować, ponieważ wywołanie RemovePart wymaga ComposablePart który korzeń wyraźnie nie jest. Inne proste przykłady pokazują, jak utworzyć część i usunąć część, ale odwołanie do utworzonej części (jak ComposablePart) jest pamiętane, więc usunięcie po prostu używa tego odwołania. Nie chcę zachować odniesienia do każdej części w kontenerze, gdy tylko zostaną utworzone, po prostu chcę usunąć część z kontenera w dowolnym miejscu w mojej aplikacji, bez konieczności utrzymywania w niej odwołania.

Oto co próbuję zrobić, stosując dokładnie ten sam wzór podany w dokumentacji związanej powyżej:

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(); 
    } 
} 

Ale to daje mi następujący błąd kompilacji:

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

który jest dokładnie ten sam błąd, który dostaję, jeśli użyję kodu bezpośrednio z dokumentacji powiązanej powyżej.

Czy nie można po prostu usunąć czegoś z pojemnika MEF?

+0

To prawda, to był ślepy zaułek. Przepraszam. – Marc

+0

Co ze przeciążeniem CompositionContainer.ReleaseExport i ReleaseExports? –

+0

ReleaseExport (s) po prostu wywołuje IDisposable na części. Jeśli część nie implementuje IDisposable, to nic nie robi i kontener pozostaje niezmieniony po wywołaniu. – meyousikmann

Odpowiedz

0

Ten link może być pomocne: How do I get MEF to recompose when I change a part?

Ale krótko mówiąc: można usunąć z MEF instancji, ale nie można usunąć definicję eksportowej bez upuścić kompletny katalog, skomponuj i przesączyć go (po prostu nie dodawać coś).