Pergunta

Estou brincando com o novo System.comPonentModel.comPosition namespace no .net 4.0 beta 2, também conhecido como o Estrutura de extensibilidade gerenciada.

Eu uso o seguinte exemplo C# onde um Monkey importações a Banana:

public interface IBanana 
{ 
}

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

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

No entanto, quando tento compor o macaco da seguinte forma, então eu recebo um InvalidOperationException com a mensagem "Este objeto não foi inicializado - a propriedade 'SourceProvider' deve ser definida.":

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

O que estou perdendo aqui? Estou ciente de que posso passar no catálogo diretamente sem envolvê -lo em um CatelogExportProvider, mas o que acima também não deveria funcionar?

Foi útil?

Solução

O catalogexportProvider precisa de uma referência de volta ao contêiner. O código a seguir deve funcionar:

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

O contêiner faz isso automaticamente quando você passa um catálogo para o construtor. Eu não acho que muitas vezes há muito motivo para criar o catalogexportProvider manualmente.

A razão pela qual o catalogexportProvider precisa de uma referência ao contêiner é que pode haver peças no catálogo com importações que precisam ser satisfeitas por outros provedores de exportação que o contêiner está conectado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top