MEF и WPF без призмы

Может кто-нибудь показать мне пример построения MEF Composition Container в файле app.xaml.cs без использования призмы или консольного приложения, которое не вызывает проблем.

Экспорт работает, но импорт не работает, и все примеры, которые я вижу, работают только с Prism, который я не хочу использовать. Импорт будет работать, если в файле App.xaml.cs, но я не понимаю, почему импорт не будет работать в MainWindow.cs и все находится в корневой сборке.

Я могу заставить его сочинять, если я делаю композицию в конструкторе MainWindow, но я хотел бы сочинить в app.xaml.cs, если это возможно.

Вот пример (на самом деле я использую mvvm, но этот пример ведет себя так же с кодом позади).

 public partial class App : Application
{
    public App()
    {
        ShutdownMode = ShutdownMode = ShutdownMode.OnMainWindowClose;

    }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);



        Compose();

       var window = new MainWindow();
        window.Show();

    }

    public void Compose()
    {
        var catalog = new AggregateCatalog(new AssemblyCatalog(Assembly.GetExecutingAssembly()), new DirectoryCatalog("."));
        var container = new CompositionContainer(catalog);
        container.ComposeParts(this);
    }


}

 [Export]
public class MessagePlugin
{
    public string GetMessage()
    {
        return "Successfully composed message";
    }

}

 public partial class MainWindow : Window
{
    [Import]
    public MessagePlugin plugin { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;

    }


    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var p = plugin; <-------------------------------NULL
        MessageBox.Show(p.GetMessage());

    }
}

1 ответ

Решение
public partial class App : Application
{
   private CompositionContainer container;

    [Import(typeof(Window))]
    public Window TheMainWindow { get; set; }


    public App()
    {
        ShutdownMode = ShutdownMode = ShutdownMode.OnMainWindowClose;
    }


    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);

        TheMainWindow = new MainWindow();

        Compose();

        Application.Current.MainWindow = TheMainWindow;
        Application.Current.MainWindow.Show();

    }

    public void Compose()
    {
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(typeof(App).Assembly));  
        container = new CompositionContainer(catalog);
        container.ComposeParts(this);
    }

}

[Export(typeof(Window))] открытый частичный класс MainWindow: Window { [Import] public MessagePlugin plugin { get; задавать; }

    public MainWindow()
    {
        InitializeComponent();
        Loaded += MainWindow_Loaded;

    }


    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var p = plugin;

        if (p != null)
        {
            MessageBox.Show(p.GetMessage());
        }
        else
        {
            MessageBox.Show("Plugin NOT Composed");
        }


    }
}
Другие вопросы по тегам