4 Stimmen

MEF-Ausnahme " 'SourceProvider' muss gesetzt sein."

Ich spiele gerade mit dem neuen System.ComponentModel.Composition Namespace in .NET 4.0 Beta 2, auch bekannt als die Managed Extensibility Framework .

Ich verwende das folgende C#-Beispiel, in dem eine Monkey importiert ein Banana :

public interface IBanana 
{ 
}

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

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

Wenn ich jedoch versuche, den Affen wie folgt zu komponieren, erhalte ich eine InvalidOperationException mit der Nachricht " Dieses Objekt wurde nicht initialisiert - die Eigenschaft 'SourceProvider' muss gesetzt werden. ":

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

Was übersehe ich hier? Ich bin mir bewusst, dass ich den Katalog direkt übergeben kann, ohne ihn in einen CatelogExportProvider zu verpacken, aber sollte das oben genannte nicht auch funktionieren?

5voto

Daniel Plaisted Punkte 16486

Der CatalogExportProvider benötigt einen Verweis zurück auf den Container. Der folgende Code sollte funktionieren:

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

Der Container tut dies automatisch, wenn Sie einen Katalog an den Konstruktor übergeben. Ich glaube nicht, dass es oft einen Grund gibt, den CatalogExportProvider manuell zu erstellen.

Der Grund, warum der CatalogExportProvider einen Verweis auf den Container benötigt, ist, dass es im Katalog Teile mit Importen geben kann, die von anderen Export-Providern erfüllt werden müssen, an die der Container angeschlossen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X