MEF儿童容器的重组

时间:2011-02-25 09:35:20

标签: mef containers nested

我已经构建了一个创建服务的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 个答案:

答案 0 :(得分:3)

您想要使用父/子容器实现什么目标?在您显示的代码中,您实际上并没有创建父级和子级,而是创建了两个不相关的容器。要实际创建子容器,请执行以下操作:

var childContainer = new CompositionContainer(childCatalog, parentContainer);

然后父母中的任何内容都将自动显示在子项中(因此您不必通过批处理添加它)。您将需要一个子容器的不同目录以及您想要在子容器中的部分。