Domanda

Ho difficoltà a ottenere la MEF per soddisfare un'importazione e potrebbe usare un po 'di aiuto.

Sfortunatamente, il problema si manifesta solo in una base di codice di produzione. Ho provato a semplificare il problema, quindi ho potuto pubblicare un esempio e vedere dove è la mia mancanza di comprensione, ma la versione semplificata ha funzionato. Quindi questo è o mi manca la differenza (e ho fatto del mio meglio per cercare accuratamente i due), o la complessità è necessaria per riprodurre.

Ho un'applicazione WPF che consumano librerie di classe 4.5 4.5 e librerie di classe portatili (targeting .NET 4.5 e app di Windows 8 Store). Non ho ancora un'applicazione di Windows 8 Store, ma è pianificata (quindi il mal di testa). Sto usando MEF 2 che ho tirato fuori dalla Nuget di recente:

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

Immagino cosa sto cercando è un consiglio su come eseguire il debug di questo, dal momento che non sarò in grado di pubblicare il codice effettivo. La maggior parte dei consigli online che posso trovare su come eseguire il debug non sembra funzionare con MEF 2, almeno non questa versione compatibile con PCL. Quanto segue è la mia versione semplificata ma, ancora una volta, questa versione funziona.

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 prende il valore "Esportato". Nel mio codice di produzione ottengo una composizioneFailedException con i dettagli:

.

Informazioni aggiuntive: Manca di dipendenza "Userinformation" su 'MainWindowviewModel'.

È stato utile?

Soluzione

Ho trovato la mia causa principale.

My .NET 4.5 Assembly stavano arrivando a MEF utilizzando:

using System.ComponentModel.Composition;
.

Mentre il mio assemblato PCL stava usando:

using System.Composition;
.

Aggiornamento di tutto per sistemare.Composition ha risolto il problema.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top