MEF容器层次结构和GetExports <T>

yal*_*lie 5 c# containers mef hierarchy

我正在使用容器层次结构来控制IDisposable部件的生命周期.子容器附加到包含非共享部分的筛选目录.这是一段代码:

[Export(typeof(ITest)), PartCreationPolicy(CreationPolicy.NonShared)]
class Test : ITest, IDisposable
{
    public void Dispose() {}
}

public interface ITest {}

class Program
{
  static void Main()
  {
    // parent container to hold shared disposable parts
    var cat = new AssemblyCatalog(typeof(Program).Assembly);
    var parent = new CompositionContainer(cat);

    // child container to hold non-shared disposable parts
    var nsCat = CreateNonSharedPartCatalog(cat);
    var child = new CompositionContainer(nsCat, parent);

    // no cardinality mismatch exception: exactly one export found
    var exp = child.GetExport<ITest>();

    // lazy exports: count == 2 -- why?
    var exports = child.GetExports<ITest>();
    Console.WriteLine("Exports count = {0}", exports.Count());
  }

  static ComposablePartCatalog 
    CreateNonSharedPartCatalog(ComposablePartCatalog cat)
  {
    return new FilteredCatalog(cat,
      def => def.Metadata.ContainsKey(
        CompositionConstants.PartCreationPolicyMetadataName) &&
      ((CreationPolicy)def.Metadata[
        CompositionConstants.PartCreationPolicyMetadataName]) == 
          CreationPolicy.NonShared);
  }
}
Run Code Online (Sandbox Code Playgroud)

(FilteredCatalog类与MEF文档中提到的相同).

GetExport不会抛出基数不匹配异常,这表示没有歧义(确切地找到一个导出).但令我惊讶的是,GetExports()返回2个延迟导出而不是1.

我这个bug还是这个行为是设计的?我如何设置子容器,以便GetExports在此示例中返回一个导出?

Nic*_*rdt 3

这是 MEF 中使用过滤目录的容器层次结构的已知限制。我相信(但现在无法确认)设置导入源:

[ImportMany(Source=ImportSource.Local)]
public IEnumerable<ITest> Tests { get; set; }
Run Code Online (Sandbox Code Playgroud)

应该提供您想要的行为(但仅限于 MEF2/.NET 4.5 开发人员预览版)。

希望这可以帮助!