2016-03-07 1 views
1

Je n'arrive pas à comprendre ce que fait l'option MEF DisableSilentRejection. I pensé que l'utilisation de cette option permettrait d'améliorer la clarté des erreurs de composition, en particulier dans le cas où une dépendance manque plusieurs niveaux en dessous de l'objet demandé. Cependant, cela ne semble pas avoir d'effet sur les messages d'erreur. J'utilise ce cas de test pour étudier comment MEF signale des erreurs. J'ai une chaîne de dépendance Foo1 -> foo2 -> foo3:CompositionOptions.DisableSilentRejection ne fonctionne pas

[Export] 
public class Foo1 
{ 
    [ImportingConstructor] 
    public Foo1(Foo2 foo2) 
    { 
    } 
} 

[Export] 
public class Foo2 
{ 
    [ImportingConstructor] 
    public Foo2(Foo3 foo3) 
    { 
    } 
} 

[Export] 
public class Foo3 
{ 
} 

Et ce code pour demander un objet Foo1 du conteneur MEF:

try 
{ 
    using (var exportProvider = new CatalogExportProvider(
      new TypeCatalog(typeof(Foo1), typeof(Foo2)))) 
    using (var container = new CompositionContainer(
      CompositionOptions.DisableSilentRejection, exportProvider)) 
    { 
     exportProvider.SourceProvider = container; 
     container.GetExportedValue<Foo1>(); 
    } 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e.Message); 
    Console.WriteLine(e.StackTrace); 
} 

Le code ci-dessus imprimer une exception de composition, parce que Foo3 est manquant dans le TypeCatalog. C'est ce à quoi je m'attendais.

Toutefois, le message d'erreur se plaint encore que l'exportation Foo1 est manquante, au lieu de fournir une erreur claire sur la dépendance Foo2-Foo3. N'est-ce pas ce que DisableSilentRejection était supposé réparer? Qu'est-ce que je rate?

Répondre

2

Transforme que le constructeur ExportProvider prend également des options de composition:

using (var exportProvider = new CatalogExportProvider(
     new TypeCatalog(typeof(Foo1), typeof(Foo2)), 
     CompositionOptions.DisableSilentRejection)) // Added composition options here! 
using (var container = new CompositionContainer(
     CompositionOptions.DisableSilentRejection, 
     exportProvider)) 
{ 
    exportProvider.SourceProvider = container; 
    container.GetExportedValue<Foo1>(); 
} 

Ou encore, je pourrais juste avoir utilisé le constructeur CompositionContainer qui prend un catalogue directement:

using (var container = new CompositionContainer(
     new TypeCatalog(typeof(Foo1), typeof(Foo2)), 
     CompositionOptions.DisableSilentRejection)) 
{ 
    container.GetExportedValue<Foo1>(); 
} 

(Dans mon cas d'utilisation réel, j'ai besoin de donner la priorité aux exportations d'un fournisseur d'exportation plutôt que l'autre, c'est pourquoi je prenais la route la plus compliquée.)