2013-04-10 23 views
5

Questa domanda sembra essere stata chiesta più volte, ma non ho ancora trovato alcuna risposta che funzioni effettivamente. Molto semplicemente, come faccio a rimuovere qualcosa da un contenitore MEF.Rimozione dal contenitore MEF

Anche il codice mostrato qui https://mef.codeplex.com/wikipage?title=Parts%20Lifetime in AddPart/RemovePart non funziona in quanto non verrà compilato come elencato. Il codice mostra questo:

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

Questo non verrà compilato perché la chiamata a RemovePart richiede una ComposablePart che principale non è chiaro. Altri semplici esempi mostrano come creare la parte e rimuovere la parte, ma viene ricordato un riferimento alla parte creata (come ComposablePart), quindi la rimozione utilizza solo tale riferimento. Non voglio mantenere un riferimento a ciascuna parte nel contenitore ogni volta che vengono creati, voglio solo rimuovere una parte dal contenitore in qualsiasi punto arbitrario della mia applicazione senza dover mantenere un riferimento ad esso.

Ecco quello che sto cercando di fare utilizzando lo stesso modello esatto elencati nella documentazione linkato sopra:

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

Ma questo mi dà il seguente errore di compilazione:

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

Che è esattamente lo stesso errore che ottengo se utilizzo il codice direttamente dalla documentazione collegata sopra.

Non c'è modo di rimuovere semplicemente qualcosa dal contenitore MEF?

+0

Vero, quello era un vicolo cieco. Scusate. – Marc

+0

Che dire degli overload di CompositionContainer.ReleaseExport e ReleaseExports? –

+0

ReleaseExport chiama solo IDisposable sulla parte. Se la parte non implementa IDisposable, non fa nulla e il contenitore rimane invariato dopo la chiamata. – meyousikmann

risposta

0

Questo link potrebbe essere utile: How do I get MEF to recompose when I change a part?

Ma per farla breve: è possibile rimuovere dal MEF un'istanza, ma non è possibile rimuovere una definizione di esportare senza far cadere il catalogo completo, ricomporre e filtrarli (semplicemente non aggiungere qualcosa).