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?
To prawda, to był ślepy zaułek. Przepraszam. – Marc
Co ze przeciążeniem CompositionContainer.ReleaseExport i ReleaseExports? –
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