Używam hierarchii kontenerów do kontrolowania czasu życia części IDisposable. Kontener potomny jest dołączany do przefiltrowanego katalogu zawierającego niepodzielone części. Oto fragment kodu:Hierarchia kontenerów MEF i GetExports <T>
[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);
}
}
(Klasa FilteredCatalog jest taka sama, jak wspomniano w dokumentacji MEF).
GetExport nie generuje wyjątku niezgodności liczności, który wskazuje, że nie ma żadnych niejednoznaczności (znaleziono dokładnie jeden eksport). Ale ku mojemu zaskoczeniu, GetExports() zwraca 2 leniwy eksport zamiast 1.
Czy to błąd czy to zachowanie jest zgodne z projektem? Jak mogę skonfigurować kontener podrzędny, aby GetExports zwrócił jeden eksport w tym przykładzie?
czy cokolwiek importuje 'ITest'? –
Nie, opublikowałem tutaj cały fragment. Usuwany jest tylko kod klasy usings i FilteredCatalog. – yallie