Sto utilizzando la gerarchia di container per controllare le parti IDisposable a vita. Il contenitore secondario è collegato al catalogo filtrato che contiene parti non condivise. Ecco un frammento di codice:Gerarchia contenitore MEF e 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);
}
}
(classe FilteredCatalog è la stessa che menzionato nella documentazione MEF).
GetExport non lancia un'eccezione di disallineamento di cardinalità che indica che non vi è ambiguità (viene trovata esattamente un'esportazione). Ma con mia sorpresa, GetExports() restituisce 2 esportazioni pigre invece di 1.
I un bug o questo comportamento è di progettazione? Come posso configurare il contenitore figlio in modo che GetExports restituisca un'esportazione in questo esempio?
c'è qualcosa che importa 'ITest'? –
No, ho pubblicato lo snippet completo qui. Solo le usanze e il codice della classe FilteredCatalog sono stati rimossi. – yallie