Pregunta

Tengo problemas para que MEF satisfaga una importación y podría usar alguna ayuda.

Desafortunadamente, el problema solo se manifiesta en una base de código de producción. Intenté simplificar el problema, por lo que podría publicar un ejemplo y ver dónde está mi falta de comprensión, pero la versión simplificada funcionó. Así que esto es, ya sea, me estoy perdiendo la diferencia (y he hecho todo lo posible para mirar a fondo en los dos), o la complejidad es necesaria para reproducirse.

Tengo una aplicación WPF que consume .NET 4.5 bibliotecas de clase y bibliotecas de clases portátiles (orientación .NET 4.5 y aplicaciones de Windows 8 Store). Aún no tengo una aplicación de Tienda de Windows 8, pero está prevista (por lo tanto, el dolor de cabeza). Estoy usando MEF 2 que salí de Nuget recientemente:

  <package id="Microsoft.Composition" version="1.0.20" targetFramework="portable-net45+win" />

Supongo que lo que estoy buscando es un consejo sobre cómo depurar esto, ya que no podré publicar el código real. La mayoría de los consejos en línea que puedo encontrar sobre cómo depurar no parece funcionar con MEF 2, al menos no esta versión compatible con PCL. La siguiente es mi versión simplificada pero, nuevamente, esta versión 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 hace que el valor "exportado". En mi código de producción obtengo una composiciónFailedException con detalles:

Información adicional: Falta la dependencia 'UserInformation' en 'Mainwindowviewmodel'.

¿Fue útil?

Solución

Encontré mi causa raíz.

My .NET 4.5 Assemblies se estaban metiendo en MEF usando:

using System.ComponentModel.Composition;

Mientras que mis ensamblajes de PCL estaban usando:

using System.Composition;

Actualizando todo a System Tamposición resolvió el problema.

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