Vra

Ek speel rond met die nuwe System.ComponentModel.Composition naamruimte in NET 4.0 beta 2, ook bekend as die Bestuurde Uitbreidings raamwerk .

Ek gebruik die volgende C # voorbeeld waar 'n Monkey invoer 'n Banana:

public interface IBanana 
{ 
}

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

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

Maar wanneer ek probeer om die aap te komponeer soos volg dan kry ek 'n InvalidOperationException met die boodskap " Hierdie voorwerp is nie geïnisialiseer - die eiendom 'SourceProvider' moet stel nie .":

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

Wat mis ek hier? Ek is bewus daarvan dat ek die katalogus kan slaag direk sonder wikkel dit in 'n CatelogExportProvider, maar moet nie die bogenoemde ook werk?

Was dit nuttig?

Oplossing

Die CatalogExportProvider moet 'n verwysing na die houer. Die volgende kode moet werk:

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

Die houer doen dit outomaties wanneer jy 'n katalogus in die konstruktor te slaag. Ek dink nie daar is dikwels veel van 'n rede om die CatalogExportProvider hand te skep.

Die rede waarom die CatalogExportProvider moet 'n verwysing na die houer is dat daar dele in die katalogus met invoere kan wees wat aangespreek moet word oortuig deur ander uitvoer verskaffers wat die houer is verslaaf aan.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top