MEF контейнерная иерархия и GetExports <T> - PullRequest
5 голосов
/ 25 января 2012

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

1 Ответ

2 голосов
/ 26 января 2012

это известное ограничение контейнерных иерархий в MEF с использованием отфильтрованных каталогов.Я полагаю (но не могу подтвердить прямо сейчас), что установка источника импорта:

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

должна давать поведение, которое вы хотите (но только в MEF2 / .NET 4.5 Developer Preview).

Надеюсь, это поможет!

...