Domanda

sto giocando intorno con il nuovo namespace System.ComponentModel.Composition in .NET 4.0 beta 2, noto anche come Extensibility Managed quadro.

Io uso il seguente C # esempio in cui un Monkey importa una Banana:

public interface IBanana 
{ 
}

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

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

Tuttavia, quando provo a comporre la scimmia come segue allora ottengo un InvalidOperationException con il messaggio " Questo oggetto non è stato inizializzato - la proprietà 'SourceProvider' deve essere impostato .":

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

Che cosa mi manca qui? Sono consapevole che posso passare il catalogo direttamente senza avvolgendolo in un CatelogExportProvider, ma non dovrebbe quanto sopra anche lavorare?

È stato utile?

Soluzione

Il CatalogExportProvider ha bisogno di un riferimento al contenitore. Il seguente codice dovrebbe funzionare:

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

Il contenitore fa automaticamente quando si passa un catalogo al costruttore. Non credo che ci sia spesso molto di un motivo per creare il CatalogExportProvider manualmente.

Il motivo per il CatalogExportProvider ha bisogno di un riferimento al contenitore è che ci possono essere parti nel catalogo con le importazioni che devono essere soddisfatti da altri fornitori di esportazione che il contenitore è collegato a.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top