Иерархия контейнеров MEF и GetExports

Я использую иерархию контейнеров для управления сроком службы 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);
  }
}

(класс FilteredCatalog совпадает с упомянутым в документации MEF).

GetExport не генерирует исключение несоответствия мощности, которое указывает на отсутствие двусмысленности (найден только один экспорт). Но, к моему удивлению, GetExports () возвращает 2 ленивых экспорта вместо 1.

Я это ошибка или такое поведение является преднамеренным? Как мне настроить дочерний контейнер, чтобы GetExports возвращал один экспорт в этом примере?

5
задан yallie 25 January 2012 в 08:06
поделиться