A exceção do MEF "'SourceProvider' deve ser definida.”
-
20-09-2019 - |
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?
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.