我已经构建了一个创建服务的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,但这也不起作用。
答案 0 :(得分:3)
您想要使用父/子容器实现什么目标?在您显示的代码中,您实际上并没有创建父级和子级,而是创建了两个不相关的容器。要实际创建子容器,请执行以下操作:
var childContainer = new CompositionContainer(childCatalog, parentContainer);
然后父母中的任何内容都将自动显示在子项中(因此您不必通过批处理添加它)。您将需要一个子容器的不同目录以及您想要在子容器中的部分。