Вопрос

У меня проблемы с тем, чтобы получить MEF, чтобы удовлетворить импорт и может использовать некоторую помощь.

К сожалению, проблема проявляется только в базе продукции кода. Я пытался упростить проблему, чтобы я мог бы опубликовать пример и увидеть, где мое отсутствие понимания, но упрощенная версия работала. Так что это либо я упускаю разницу (и я сделал все возможное, чтобы тщательно выглядеть на двух), или сложность необходима для воспроизведения.

У меня есть приложение WPF, потребляющее библиотеки классов .NET 4.5 и библиотеки портативных классов (нацеливание .NET 4.5 и приложения для хранения Windows 8). У меня еще нет приложения для хранения Windows 8, но планируется (при этом головная боль). Я использую MEF 2, что недавно снял Nuget:

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

Я думаю, что я ищу, есть несколько советов о том, как отлаживать это, так как я не смогу публиковать фактический код. Большинство онлайн-консультаций, которые я могу найти о том, как отладить, кажется, не работает с MEF 2, по крайней мере, не эта PCL-совместимая версия. Ниже приведена моя упрощенная версия, но, опять же, эта версия работает.

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 делает значение «экспортировано». В моем производственном коде я получаю компаниюFailedException с деталями:

Дополнительная информация: отсутствующая зависимость «UserInformation» на «MainWindowViewModel».

Это было полезно?

Решение

Я нашел свою корневую причину.

Мои .NET 4.5 Сборы получали в MEF, используя:

using System.ComponentModel.Composition;
.

Пока мою сборку PCL используют:

using System.Composition;
.

Обновление всего до System.Composition Решина проблема.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top