Question

Je jouais avec le nouveau espace de noms de System.ComponentModel.Composition dans .NET 4.0 beta 2, également connu comme le Managed Extensibilité cadre.

J'utilise l'exemple suivant C # 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 sais que je peux passer le catalogue directement sans l'emballer dans un CatelogExportProvider, mais ne devrait pas ci-dessus aussi travailler?

Était-ce utile?

La solution

Le CatalogExportProvider a besoin d'un renvoi au 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 fait automatiquement lorsque vous passez un catalogue dans le constructeur. Je ne pense pas qu'il y ait souvent beaucoup d'une raison de créer le CatalogExportProvider manuellement.

La raison pour laquelle le 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 que le conteneur est relié à.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top