Pregunta

Estoy jugando con el nuevo espacio de nombres System.ComponentModel.Composition en .NET 4.0 beta 2, también conocida como la extensibilidad Gestionado marco.

utilizo el siguiente ejemplo de C # donde 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; }
}

Sin embargo, cuando trato de componer el mono como sigue entonces me sale un InvalidOperationException con el mensaje " Este objeto no se ha inicializado - la propiedad 'SourceProvider' debe ajustarse ."

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

¿Qué me estoy perdiendo aquí? Soy consciente de que me puede pasar el catálogo directamente sin envolverlo en un CatelogExportProvider, pero no debe lo anterior también trabajar?

¿Fue útil?

Solución

El CatalogExportProvider necesita una referencia de nuevo al recipiente. El siguiente código debería funcionar:

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

El contenedor lo hace automáticamente cuando se pasa de un catálogo en el constructor. No creo que a menudo hay mucho de una razón para crear el CatalogExportProvider manualmente.

La razón por la CatalogExportProvider necesita una referencia al contenedor es que puede haber partes del catálogo con las importaciones que deben ser satisfechas por otros proveedores de exportación que el contenedor está conectado a.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top