2010-08-14 3 views
1

J'ai une propriété définie sur une classe qui a le importManyAttribute défini pour elle, la déclaration est la suivante:Problème recomposant sur un ImportMany avec MEF

public const string FontStyleProvidersPropertyName = "FontStyleProviders"; 
[ImportMany(typeof(IFontStyleProvider), RequiredCreationPolicy = CreationPolicy.Shared, AllowRecomposition=true)] 
public List<IFontStyleProvider> FontStyleProviders { get; set; } 

sur la première manche, je bâtirai mon conteneur de composition suit

private CompositionContainer BuildCompositionContainer() 
{ 
    //build our composable parts catalog 
    Assembly executingAssembly = Assembly.GetExecutingAssembly(); 
    CompositionContainer applicationContainer; 
    string localPath = Path.GetDirectoryName(executingAssembly.Location); 

    try 
    { 
     aggregateCatalog = new AggregateCatalog(); 
     aggregateCatalog.Catalogs.Add(new AssemblyCatalog(executingAssembly)); 

     if (!Directory.Exists(Path.Combine(localPath, ApplicationExtensionsPath))) 
     { 
      Directory.CreateDirectory(Path.Combine(localPath, ApplicationExtensionsPath)); 
     } 

     exportsCatalog = new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath)); 

     aggregateCatalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath))); 

     //create a composition container 
     return applicationContainer = new CompositionContainer(aggregateCatalog); 
    } 
    catch (Exception e) 
    { 
     Debug.Fail("Catalog Construction Failed", e.StackTrace); 
     throw; 
    } 
} 

à ce stade, tout fonctionne comme prévu, mais je ne peux pas sembler déclencher: composition sur « cette » instance de classe. J'ai une méthode d'importation comme suit:

private void Import() 
{ 
    exportsCatalog.Refresh(); 
    CompositionBatch batch = new CompositionBatch(); 
    batch.AddPart(this); 
    applicationContainer.Compose(batch); 

    var copy = PropertyChanged; 
    if (copy != null) 
    { 
     copy(this, new PropertyChangedEventArgs(FontStyleProvidersPropertyName)); 
     copy(this, new PropertyChangedEventArgs(MessageContainerViewModelsPropertyName)); 
    } 
} 

Il trouve de nouveaux types dans le dossier ApplicationExtensionPath utilisé par le exportsCatalog très bien, mais il n'a jamais vraiment re-construit FontStyleProviders (ou MessageContainerViewModels)

J'ai été à travers les documents à quelques reprises et je n'arrive pas à comprendre pourquoi.

Répondre

2

Le problème est que vous n'avez pas réellement ajouté le catalogue que vous appelez Refresh() dans AggregateCatalog. Changer ceci:

exportsCatalog = new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath)); 
aggregateCatalog.Catalogs.Add(new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath))); 

à ceci:

exportsCatalog = new DirectoryCatalog(Path.Combine(localPath, ApplicationExtensionsPath)); 
aggregateCatalog.Catalogs.Add(exportsCatalog); 

Aussi, une fois votre classe a été composée une fois que vous ne devriez pas le composer à nouveau. Un simple appel du exportsCatalog.Refresh() sera suffisant pour provoquer la recomposition.