2011-01-14 12 views
0

Ich entwickle wpf app mit MVVM Design. Als MVVM-Framework verwende ich Caliburn Micro. Service habe ich in der externen Montage, und es ist in Ansicht Modelle Klassen mit MEF injiziert.Inject viele Klassen in Ansicht Modell Klasse

Problem in Service, den ich viele kleine Klasse haben, versuche ich SOLID principe respektieren.

[Export(typeof(IClassA)] 
public class ClassA : IClassA 
{} 

[Export(typeof(IClassB)] 
public class ClassB : IClassB 
{} 

[Export(typeof(IClassC)] 
public class ClassC : IClassC 
{} 

//... 
[Export(typeof(IClassK)] 
public class ClassK : IClassK 
{} 

Klassen zählen etwa 12-15.

Ich brauche diese Klassen im Hinblick auf Modellklasse verwenden. Also ich benutze dies:

public class MyViewModelClass 
{ 
private interface IClassA _a; 
private interface IClassB _b; 
private interface IClassC _c; 


//... 
private interface IClassK _k; 


[ImportingConstructor] 
public MyViewModelClass(IClassA a, IClassB b, IClass c, ..., IClassK k) 
{ 
_a=a; _b=b; _c=c; ... _k=k 

} 

} 

Ich weiß nicht, dass dieser Weg richtig ist. Oder es existiert etwas Elegantes, Einfaches. Danke für Ihre Meinung und Ratschläge.

Antwort

0

MEF können Felder importieren (auch private). Wenn Sie Ihr Leben ein wenig einfacher machen möchten, können Sie einfach die Felder mit der ImportAttribute dekorieren. Wenn Sie wissen wollen, wenn alle Importe abgeschlossen haben, implementieren nur die IPartImportsSatisfiedNotification Schnittstelle:

public class MyViewModelClass : IPartImportsSatisfiedNotification 
{ 
    [Import] 
    private IClassA _a; 
    [Import] 
    private IClassB _b; 
    [Import] 
    private IClassC _c; 

    ... 

    public void OnImportsSatisfied() 
    { 
     // add initialization code here 
    } 
} 

Diese ziemlich erfordert, dass Sie MEF verwenden, um sicherzustellen, dass Ihr Ansichtsmodell korrekt instanziiert wird, aber auf Ihrem Szenario abhängig die möglicherweise nicht sei eine große Sache.

1

An: Abe Heidbrecht.

Ich bin wenig verwirren. Wenn ich dies verwende:

public class MyViewModelClass : IPartImportsSatisfiedNotification 
{ 
    [Import] 
    private IClassA _a; // I need init _a? 
    [Import] 
    private IClassB _b; 
    [Import] 
    private IClassC _c; 

    ... 

    public void OnImportsSatisfied() 
    { 
     // what code must be here ? 
     //how can I check if all import was success 
    } 
} 

Weil.

IPartImportsSatisfiedNotification hat nur eine einzige Methode: OnImportsSatisfied, die aufgerufen wird, wenn alle Importe, die erfüllt sind erfüllt werden konnten.

Ich denke, es ist besser für Unit-Tests init Schnittstellen von Diensten Klasse in contstructor Sichtmodellklasse.

+0

OnImportsSatisfied wird nur aufgerufen, wenn alle Importe erfolgreich waren. Im Grunde wäre der Code, der in dieser Methode verwendet wird, der Code, den Sie in Ihren Konstruktor setzen, um Ihr Objekt normalerweise in Ihrem Konstruktor zu initialisieren. Da die Importe in Ihrem Konstruktor nicht verfügbar sind, können Sie sie erst verwenden, wenn diese Methode aufgerufen wird. Wenn Importe nicht erfüllt werden können, werden die normalen MEF-Ausnahmen ausgelöst, die Sie auf fehlende Exporte hinweisen. –

+0

Oki, Danke für die Erklärung –

Verwandte Themen