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'.

Foi útil?

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.

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