MEF循环依赖关系

本文关键字:关系 依赖 循环 MEF | 更新日期: 2023-09-27 18:28:11

假设我们有两个相互依赖的组件(通过接口间接地):

public interface IAlice { ... }
public interface IBob { ... }
[Export(typeof(IAlice)), PartCreationPolicy(CreationPolicy.NonShared)]
class Alice : IAlice
{
    [Import]
    private IBob Bob { get; set; }
    ...
}
// could be defined in some assembly developed by another team
[Export(typeof(IBob)), PartCreationPolicy(CreationPolicy.NonShared)]
class Bob : IBob
{
    [Import]
    private IAlice Alice { get; set; }
    ...
}

这导致合成失败:合成失败是因为它没有在"100"次迭代内完成。这很可能是由标有非共享创建策略的零件的依赖关系图中的循环引起的。

我知道我可以通过Lazy声明导入,但这种方式将根据需要创建导入,同时我需要我的Alice引用Bob,Bob引用Alice的同一实例。我原以为CompositionContainer会在一个合成操作中解决这样的循环,但显然不是这样。

我不能将部分声明为共享,因为每个容器不需要一个Alice和Bob。我只需要在一个组合操作中完成时,将这样的依赖关系图作为一个整体来创建。有什么变通办法吗?

UPD。添加了一些澄清。

MEF循环依赖关系

为什么不让Alice通过ctor注入导入IBob,然后显式设置Bob的Alice属性(即Bob不应该对Alice使用属性注入)?