Как мога да използвам 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 app.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();

    }
}

Component.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
}

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

[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
можете ли да публикувате решението някъде. като skydrive или mediafire. - person fhnaseer; 22.02.2012