2009-12-17 15 views
4

Je joue avec le nouvel espace de noms System.ComponentModel.Composition dans .NET 4.0 beta 2, également connu sous le nom Managed Extensibility Framework.L'exception MEF "SourceProvider" doit être définie. "

Je donne l'exemple C# suivant où Monkey importe un Banana:

public interface IBanana 
{ 
} 

[Export(typeof(IBanana))] 
public class Banana : IBanana 
{ 
} 

public class Monkey 
{ 
    [Import(typeof(IBanana))] 
    public IBanana Banana { get; set; } 
} 

Cependant, lorsque je tente de composer le singe comme suit alors je reçois un InvalidOperationException avec le message "Cet objet n'a pas été initialisé - la propriété 'SourceProvider' doit être réglé « :

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana))); 
var container = new CompositionContainer(exportProvider); 
var monkey = new Monkey(); 
container.ComposeParts(monkey); 

Qu'est-ce que je manque ici.? Je suis conscient que je peux passer le catalogue directement sans l'emballer dans un CatelogExportProvider, mais cela ne devrait-il pas marcher?

Répondre

5

CatalogExportProvider a besoin d'une référence vers le conteneur. Le code suivant devrait fonctionner:

var exportProvider = new CatalogExportProvider(new TypeCatalog(typeof(Banana))); 
var container = new CompositionContainer(exportProvider); 
exportProvider.SourceProvider = container; 
var monkey = new Monkey(); 
container.ComposeParts(monkey); 

Le conteneur le fait automatiquement lorsque vous passez un catalogue dans le constructeur. Je ne pense pas qu'il y ait souvent une bonne raison de créer le CatalogueExportProvider manuellement. La raison pour laquelle CatalogExportProvider a besoin d'une référence au conteneur est qu'il peut y avoir des parties dans le catalogue avec des importations qui doivent être satisfaites par d'autres fournisseurs d'exportation auxquels le conteneur est raccordé.

+0

Je suis arrivé à la même conclusion en examinant le System.Component.Composition.dll avec réflecteur. En ce qui concerne la raison de créer manuellement des ExportProviders, cela est nécessaire si vous souhaitez créer un conteneur qui peut se rabattre sur les valeurs par défaut sans se plaindre de plusieurs exportations correspondantes. –