Question

J'ai du mal à obtenir du MEF pour satisfaire une importation et peut utiliser une aide.

Malheureusement, le problème ne se manifeste que dans une base de code de production. J'ai essayé de simplifier le problème pour pouvoir poster un exemple et voir où mon manque de compréhension est, mais la version simplifiée a fonctionné. Donc, c'est soit que je manque la différence (et j'ai fait de mon mieux pour regarder soigneusement les deux), ou la complexité est nécessaire pour reproduire.

J'ai une application WPF consommant des bibliothèques de classe 4.5 de la classe 4.5 et des bibliothèques de classe portative (ciblant les applications de Windows 4.5 et de Windows 8 Store). Je n'ai pas encore d'application Windows 8 Store, mais elle est prévue (donc le mal de tête). J'utilise le MEF 2 que j'ai récemment tiré de Nuget:

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

Je suppose que ce que je cherche, ce sont des conseils sur la manière de déboguer cela, car je ne pourrai pas publier le code actuel. La plupart des conseils en ligne que je peux trouver sur la façon de déboguer ne semble pas fonctionner avec le MEF 2, du moins pas cette version compatible PCL. Ce qui suit est ma version simplifiée mais, encore une fois, cette version fonctionne.

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;
        }
    }
}

importéName obtient la valeur "exportée". Dans mon code de production, je reçois une compositionFaileDException avec détail:

Informations supplémentaires: Dépendance manquante 'UserInformation' sur 'MainWindowviewModel'.

Était-ce utile?

La solution

J'ai trouvé ma cause première.

Mes assemblages .NET 4.5 se remettaient à Mef en utilisant:

using System.ComponentModel.Composition;

tandis que mes assemblés PCL utilisaient:

using System.Composition;

Mise à jour de tout pour System.composition a résolu le problème.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top