Как я могу использовать MEF в своем приложении MVVM?

Может ли кто-нибудь дать мне простое приложение wpf, использующее mef и следуя шаблону mvvm. Я много искал в Интернете, но нашел очень мало примеров, и эти примеры очень сложны для понимания. некоторые примеры - это wpf, mef, но они не следуют шаблону mvvm.

вот что я пытаюсь сделать.

Будет основное приложение wpf. Это загрузит все модули (плагины) и покажет их пользователю. Модуль будет содержать 2 или 3 страницы с кнопками «Далее назад» (используются для навигации). Теперь, когда в основном приложении я выбираю модуль, модуль открывается или, что вы можете сказать, он заменяет текущее окно, а при навигации по кнопкам он меняет представление модуля.

Главное окно -> Модуль 1 -> Страница 1

                       Page 2

                       Page 3

           Module 2 -> Page 1

                       Page 2

                       Page 3

Так что теперь он выглядит чистым. Модуль 1 — это отдельный проект, модуль 2 — это отдельный проект. главное окно читает модули из dll и показывает их. щелчок по модулю будет переходить по его страницам.


person fhnaseer    schedule 21.02.2012    source источник
comment
какое приложение вы хотите создать с помощью mef, wpf и mvvm? лучше задать не очень веский вопрос.   -  person blindmeis    schedule 21.02.2012
comment
@blindmeis, я обновил вопрос, теперь ты его видишь. Я надеюсь, что это ясно.   -  person fhnaseer    schedule 21.02.2012


Ответы (2)


У Microsoft есть несколько эталонных реализаций, которые могут оказаться полезными. они являются хорошей демонстрацией MVVM/MEF и WPF. вот самый первый блог о реализации StockTrader RI со ссылкой для загрузки, указывающей здесь . обзор Microsoft реализации StockTrader RI и MVVM RI: здесь и здесь в частности реализация StockTrader RI. чт.

person mtijn    schedule 21.02.2012
comment
The sample application illustrates the use of ASP.NET and Windows Communication Foundation (WCF) technologies in an end-to-end service-oriented architecture running in the cloud. As such, the application illustrates many best-practice programming practices for the Windows Azure Platform, SQL Azure, ASP.NET and WCF including the use of an n-tier, service-oriented design. неверная ссылка? - person Bolu; 21.02.2012
comment
действительно ли он использует wpf, mvvm, mef. это облачное приложение я думаю. поправьте меня, если я ошибаюсь. - person fhnaseer; 21.02.2012
comment
Я знаю приложение, о котором вы говорите... Думаю, оно устанавливается при установке PRISM. Это отличное начало для MEF. Если найдете ссылку, поставлю +1 :) - person Rachel; 21.02.2012
comment
вы правы, я перепутал приложение StockTrader с приложением StockTrader RI в своем предыдущем ответе. исправил, надеюсь стало лучше. - person mtijn; 21.02.2012
comment
The Page Could Not Be Found - вот почему замковые ответы плохие. Ваш ответ в другом замке: когда ответ не ответ? - person MickyD; 25.03.2015

Я сделал 2 проекта в эти дни, которые делают то, что вы хотите. что я сделал, так это создал основной проект, который не делает ничего, кроме сбора модулей через MEF и обрабатывает выбор модуля. вам также нужен компонентный проект, в котором вы настраиваете интерфейсы и экспортируете атрибуты.

вот несколько примеров кода куски:

Приложение MainProject.xaml.cs

public partial class App : Application
{
    [ImportMany]
    private IEnumerable<Lazy<IComponent, IComponentMetadata>> _components;
    private CompositionContainer _mefcontainer;

    protected override void OnStartup(StartupEventArgs e)
    {
        ShutdownMode = ShutdownMode.OnExplicitShutdown;

        //i do login stuff here

        //i use task.factory here and dynamic splashscreen here

        this.MefContainer.ComposeParts(rahmen, this);

        foreach (var component in _components)
        {
            //check metadata and fill modules collection
        }

        //add modules collection to mainwindowviewmodel

         ShutdownMode = ShutdownMode.OnMainWindowClose;

         this.MainWindow.Show();

    }
}

Компонент.dll

public interface IComponent//Marker interface
{
    bool HasChanges { get; }
}

public interface IComponentMetadata
{
    string Displayname { get; }

    int SortIndex { get; }

    string ImagePath { get; }

    string IconPath { get; }
}

[MetadataAttribute]
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class ComponentExportAttribute : ExportAttribute, IComponentMetadata
{
    private const string DEFAULTICON = "pack://application:,,,/MyComponent;Component/Images/Default.png";


    public ComponentExportAttribute(string displayname, int sortindex): base(typeof(IComponent))
    {
        this.Displayname = displayname;
        this.SortIndex = sortindex;

        this.ImagePath = DEFAULTICON;
        this.IconPath = DEFAULTICON;
    }


    public ComponentExportAttribute(string displayname, int sortindex, string imagepath, string iconpath): base(typeof(IComponent))
    {
        this.Displayname = displayname;
        this.SortIndex = sortindex;

        this.ImagePath = String.IsNullOrWhiteSpace(imagepath) ? DEFAULTICON : imagepath;
        this.IconPath = String.IsNullOrWhiteSpace(iconpath) ? DEFAULTICON : iconpath;
    }

    #region Implementation of IComponentMetadata

    public string Displayname { get; private set; }

    public int SortIndex { get; private set; }

    public string ImagePath { get; private set; }

    public string IconPath { get; private set; }

    #endregion
}

Пример модуля

[ComponentExport("Test1",  150
    , "pack://application:,,,/TestProject;Component/Test/Logo1.png"
    , "pack://application:,,,/TestProject;Component/Test/Icon1.png")]
public partial class Test1MainWindow : UserControl, IComponent
{
    [ImportingConstructor]//if you want to do DI
    public Test1MainWindow ()
    {
        InitializeComponent();
        this.DataContext = this;
    }

    #region Implementation of IComponent

    public bool HasChanges
    {
        get { return false; }
    }

    #endregion
}

или экспорт модели представления --> (если вы делаете это, вам нужно экспортировать шаблон данных в основное приложение, я могу показать это, если хотите)

[ComponentExport("Test2", 500 
    , "pack://application:,,,/TestProject;Component/Test/Logo2.png"
    , "pack://application:,,,/TestProject;Component/Test/Icon2.png")]
public class Test2: INPCBase, IComponent
{

    [ImportingConstructor]
    public Test2()
    {
    }

    #region Implementation of IKabuComponent

    public bool HasChanges
    {
        get { return false; }
    }

    #endregion
}
person blindmeis    schedule 21.02.2012
comment
можешь выложить куда-нибудь решение. как скайдрайв или медиафайр. - person fhnaseer; 22.02.2012