Этот вопрос, кажется, был задан несколько раз, но я еще не нашел ответа, который действительно работает. Очень просто, как мне удалить что-то из контейнера MEF.Удаление из контейнера MEF
Даже код, показанный здесь https://mef.codeplex.com/wikipage?title=Parts%20Lifetime в разделе AddPart/RemovePart не работает, поскольку он не будет компилироваться, поскольку он указан. Код показывает это:
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);
Это не будет компилироваться, так как вызов RemovePart требует ComposablePart которой корень явно нет. Другие простые примеры показывают, как создать деталь и удалить деталь, но ссылка на созданную часть (как ComposablePart) запоминается, поэтому удаление просто использует эту ссылку. Я не хочу хранить ссылку на каждую часть в контейнере всякий раз, когда они созданы, я просто хочу удалить часть из контейнера в любой произвольной точке приложения без необходимости ссылаться на нее во всем.
Вот что я пытаюсь сделать, используя ту же самую картину, указанный в документации связана выше:
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();
}
}
Но это дает мне следующую ошибку компиляции:
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
который является точно ту же ошибку, которую я получаю, если я использую код непосредственно из документации, указанной выше.
Нельзя ли просто удалить что-то из контейнера MEF?
Правда, это был тупик. Сожалею. – Marc
Как насчет перегрузки CompositionContainer.ReleaseExport и ReleaseExports? –
ReleaseExport (s) просто вызывает IDisposable на части. Если эта часть не реализует IDisposable, она ничего не делает и контейнер остается неизменным после вызова. – meyousikmann