MEF Рекомпозиция дочерних контейнеров - PullRequest
1 голос
/ 25 февраля 2011

Я создал контейнер MEF, который создает сервис. Я строю другой контейнер MEF с этими службами из первого контейнера. Проблема в том, что эти сервисы перекомпоновываются при добавлении во второй контейнер.

[Export(typeof(IFoo))]
public class Foo : IFoo
{
    [Import(typeof(IServiceA))]
    public IServiceA A { get; set; }
}

[Export(typeof(IServiceA))]
public class ServiceAImpl : IServiceA
{
    public ServiceAImpl()
    {
        Console.Out.WriteLine("Service A Created");
    }
}

//Create the parent container
var parentContainer = new CompositionContainer(Composer.AggregateCatalog);
IFoo foo = parentContainer.GetExportedValue<IFoo>();


//..... some work


//Create a child container providing it an existing instance of IFoo
var childContainer = new CompositionContainer(Composer.AggregateCatalog);
var batch = new CompositionBatch();
batch.AddPart(foo); //Add existing IFoo

//This causes a recomposition of IFoo resulting in 
//a new instance of IServiceA to be created and injected
childContainer.Compose(batch);

«Service A Created» вызывается дважды в последней строке выше, когда контейнер создает композицию, потому что он пытается перекомпоновать Foo, чего я не хочу.

У кого-нибудь есть решение этого? Я пытался явно указать AllowRecomposition = false, но это тоже не работает.

1 Ответ

3 голосов
/ 25 февраля 2011

Чего вы пытаетесь достичь с помощью родительских / дочерних контейнеров?В коде, который вы показываете, вы на самом деле не создаете родителя и ребенка, вы создаете два несвязанных контейнера.Чтобы действительно создать дочерний контейнер, выполните следующие действия:

var childContainer = new CompositionContainer(childCatalog, parentContainer);

Тогда все, что в родительском контейнере, будет автоматически доступно в дочернем (так что вам не придется добавлять его через пакет).Вам понадобится другой каталог для дочернего контейнера с деталями, которые вы хотите поместить в дочерний контейнер.

...