2017-04-10 1 views
0

Ich brauche MEF und MVVM Muster für meine WPF App.MEF automatisch lösen Objekt

Eigentlich habe ich ein Ansichtsmodell so definiertem:

[Export] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
class MainVM 
{   
    IServiceA serviceA;   
    IServiceB serviceB; 

    [ImportingConstructor] 
    public MainVM(IServiceA serviceA, IServiceB serviceB) 
    { 
     this.serviceA = serviceA; 
     this.serviceB = serviceB; 

     System.Diagnostics.Debug.WriteLine(serviceA.Time); 
    } 
} 

Für das VM Abrufen ich Verwendung eines VMLocator machen, so gemacht:

class ViewModelLocator 
{ 
    static ViewModelLocator instance; 

    public MainVM MainVM 
    { 
     get 
     { 
      MainVM output = MefBootstrap.Container.GetExportedValue<MainVM>(); 
      return output; 
     } 
    } 

    protected ViewModelLocator() 
    { 

    } 

    public static ViewModelLocator Instance 
    { 
     get 
     { 
      return instance ?? (instance = new ViewModelLocator()); 
     } 
    } 
} 

von XAML genannt:

DataContext="{Binding Source={x:Static provider:ViewModelLocator.Instance}, Path=MainVM}" 

Dieser Code funktioniert tatsächlich.

Was ich frage mich, ob realisierbar automatisch mit dem Import VM nur MEF ExportAttribute [Import] auf der Attributdeklaration von VMLocator statt mit GetExportValue() Methode.

Ist die eine Lösung?

+0

Haben Sie es versucht? Was war das Problem, als du das getan hast? – wkl

+0

MainVM wird überhaupt nicht aufgelöst. Ich habe versucht mit [Import] öffentliche MainVM MainVM {bekommen; einstellen; } –

Antwort

1

Es funktioniert nicht, weil Sie ViewModelLocator manuell erstellen. Da Sie es manuell erstellen IoC (MEF) hat keine Kontrolle über diese Instanz Erstellung und damit nicht [Import] Abhängigkeit (MainVM) von Container in Ihre property.

So die Frage zu beantworten: „Gibt es eine Lösung?“:

Here ist ein Beispiel dafür, wie MEF in MVVM Kontext zu nutzen.

Ich rate Ihnen dringend zu gehen mit PRISM. Es hat es schon für dich getan. Ich möchte das Rad, vor allem dieses Rad, nicht neu erfinden.

+0

Ich schaue mir PRISM + MEF-Lösung an, ehrlich gesagt bevorzuge ich es, meinen Weg zu halten, weil es zu viel Logik beim Bootstrapping gibt –

+0

Gut für MEF-Lösung benötigen Sie tatsächlich eine höhere "Kleber" -Klasse, die neue Benutzersteuerung und erstellen würde neues Viewmodel und kleben sie dann zusammen. – Karolis

+0

Ich benutzte diese alte, aber gute Lösung, die auch mit MEF kompatibel ist. https://wpftutorial.net/ReferenceArchitecture.html Die einzige schlechte Sache ist, dass ein wenig Code hinter sich, aber auch aus Container gelöst ist. Es ist mir immer noch unklar, wie man andere Aufrufe aufrufen kann, weil diese nicht vom App.xml-Modul aufgerufen werden –