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