MEF 2 Композиция с.NET 4.5, Windows Store PCL
У меня возникли проблемы с получением MEF для удовлетворения импорта и может помочь.
К сожалению, проблема проявляется только в базе производственного кода. Я попытался упростить проблему, чтобы я мог опубликовать пример и посмотреть, где мое непонимание, но упрощенная версия сработала. Так что это либо я пропускаю разницу (и я приложил все усилия, чтобы тщательно рассмотреть оба), либо сложность необходима для воспроизведения.
У меня есть приложение WPF, использующее библиотеки классов.NET 4.5 и переносимые библиотеки классов (предназначенные для приложений.net 4.5 и windows 8 store). У меня еще нет приложения для магазина 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;
}
}
}
importName действительно получает значение "Экспортировано". В моем производственном коде я получаю исключение CompositionFailedException с подробной информацией:
Дополнительная информация: Отсутствует зависимость UserInformation от MainWindowViewModel.
1 ответ
Я нашел свою основную причину.
Мои сборки.NET 4.5 собирались в MEF, используя:
using System.ComponentModel.Composition;
в то время как мои сборки PCL использовали:
using System.Composition;
Обновление всего до System.Composition решило проблему.