MEF 2 Composição .NET 4.5, Windows Store PCL
-
21-12-2019 - |
Pergunta
Estou tendo problemas para fazer o MEF para satisfazer uma importação e poderia usar alguma ajuda.
Infelizmente, o problema só se manifesta em um código de produção da base de dados.Eu tentei simplificar o problema, então eu poderia postar um exemplo e ver onde a minha falta de entendimento, mas a versão simplificada trabalhou.Então, isso é que eu estou faltando a diferença (e eu tenho feito o meu melhor para olhar cuidadosamente para os dois), ou a complexidade é necessário para reproduzir.
Eu tenho uma aplicação de WPF consumir .NET 4.5 bibliotecas de classe e de classes portátil (bibliotecas de segmentação .net 4.5 e windows 8 store apps).Eu ainda não tiver um windows 8 store aplicação, mas é planejado (assim, a dor de cabeça).Eu estou usando o MEF 2 que eu puxado para fora do NuGet recentemente:
<package id="Microsoft.Composition" version="1.0.20" targetFramework="portable-net45+win" />
Eu acho que o que eu estou procurando algumas dicas sobre como depurar isso, desde que eu não será capaz de postar o código real.A maioria dos conselhos on-line que eu possa encontrar sobre como depurar parece não funcionar com o MEF 2, pelo menos não este PCL-versão compatível.A seguinte é a minha versão simplificada, mas, novamente, esta versão funciona.
namespace Portable.Contracts
{
public interface IExportable
{
string Name { get; }
}
}
namespace Desktop
{
[Export(typeof(IExportable))]
public class Exported : IExportable
{
public string Name
{
get { return "Exported"; }
}
}
}
namespace Portable
{
public class Importer
{
[Import]
public IExportable Exportable { get; set; }
public Importer()
{
MEFLoader.ResolveImports(this);
}
public string Name { get { return Exportable.Name; } }
}
}
namespace Portable
{
public class MEFLoader
{
private static CompositionHost Container { get; set; }
public static void SetContainer(CompositionHost container)
{
Container = container;
}
public static void ResolveImports(object target)
{
if(Container != null)
{
Container.SatisfyImports(target);
}
}
}
}
namespace WPFApp
{
public partial class App : Application
{
public App()
{
var container = new ContainerConfiguration()
.WithAssembly(typeof(Exported).Assembly)
.CreateContainer();
MEFLoader.SetContainer(container);
var importer = new Importer();
var importedName = importer.Name;
}
}
}
importedName obter o valor de "Exportados".No meu código de produção recebo um CompositionFailedException com detalhes:
Informações adicionais:Falta de dependência 'UserInformation' em 'MainWindowViewModel'.
Solução
Eu descobri a minha causa.
O meu .NET 4.5 assembléias foram ficando no MEF usando:
using System.ComponentModel.Composition;
enquanto meu PCL monta estava usando:
using System.Composition;
Atualizando de tudo para Sistema.Composição resolvido o problema.