Импорт не работает при использовании MEF в WPF MVVM - PullRequest
0 голосов
/ 22 октября 2018

Я хочу сделать тест MEF на WPF.Я использую проект в качестве интерфейсов:

// Project name MEFWpfTest.Interfaces
public interface IAppViewModel
{
    string Name { get; set; }
}

, затем создаю новый проект для реализации этого интерфейса:

// Project name MEFWpfTest.ViewModels
[Export("AppViewModel")]
public class AppViewModel : IAppViewModel
{
    public string Name { get; set; }
}

в App.xaml.cs, проект WPF, я пытаюсь составлять частив MEF:

// Project name MEFWpfTest
public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        var aggregateCatalog = new AggregateCatalog();
        Assembly assembly = Assembly.GetExecutingAssembly();
        aggregateCatalog.Catalogs.Add(new AssemblyCatalog(assembly));

        var directoryPath = Path.GetDirectoryName(assembly.Location);

        if (directoryPath != null)
        {
            aggregateCatalog.Catalogs.Add(new DirectoryCatalog(directoryPath, $"MEFWpfTest.*.dll"));

        }

        CompositionContainer Container = new CompositionContainer(aggregateCatalog);
        Container.ComposeParts(this);

        MainWindow w = new MainWindow();
        w.Show();
    }
}

, затем в MainWindow.xaml.cs я использую IAppViewModel для импорта:

// Project name MEFWpfTest
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    [Import("AppViewModel")]
    public Interfaces.IAppViewModel AppVM { get; set; }

    private void Window_Loaded(object sender, RoutedEventArgs e)
    { // I set a break point here.

    }
}

, когда я запускаю это приложение, я обнаружил, что AppVM имеет значение null,Это нормально, когда я делаю то же самое в одной сборке.MEFWpfTest уже ссылался на MEFWpfTest.Interfaces и MEFWpfTest.ViewModels.

где я делаю неправильно?

1 Ответ

0 голосов
/ 22 октября 2018

Составьте части по своему конструктору:

public MainWindow()
{
    InitializeComponent();
    Container.ComposeParts(this); // get container somehow
}

Обратите внимание, что импорт класса владельца свойства / поля автоматически импортирует его свойства / поля без явного ComposeParts().Если AppViewModel имеет [Import] свойства / поля, они устанавливаются автоматически.Вам не нужно вызывать ComposeParts(this) в конструкторе AppViewModel.ComposePart() каскады импорта классов.

...