2013-04-10 3 views
5

Этот вопрос, кажется, был задан несколько раз, но я еще не нашел ответа, который действительно работает. Очень просто, как мне удалить что-то из контейнера 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?

+0

Правда, это был тупик. Сожалею. – Marc

+0

Как насчет перегрузки CompositionContainer.ReleaseExport и ReleaseExports? –

+0

ReleaseExport (s) просто вызывает IDisposable на части. Если эта часть не реализует IDisposable, она ничего не делает и контейнер остается неизменным после вызова. – meyousikmann

ответ

0

Эта ссылка может быть полезной: How do I get MEF to recompose when I change a part?

Но Короче говоря: вы можете удалить из MEF экземпляра, но вы не можете удалить определение экспорта без уронить полный каталог, перекомпонуйте и фильтровать его (просто не добавить что нибудь).

Смежные вопросы