Domanda

I sviluppare app WPF con un design MVVM. Come framework MVVM uso Caliburn Micro. Servizio Ho in assembly esterno, e viene iniettata in classi di visualizzazione modelli con MEF.

Problema in servizio Ho molti piccola classe, cerco di rispettare principe SOLIDO.

[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
{}

contano classi è di circa 12-15.

Ho bisogno utilizzare questa classe in classe vista del modello. Quindi io uso questo:

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

}

}

Io non che in questo modo è corretto. O esiste qualcosa di elegante, semplice. Grazie per la tua opinione e consigli.

È stato utile?

Soluzione

MEF può importare a campi (anche quelli privati). Se si vuole rendere la vita un po 'più facile, si può solo decorare i campi con l'ImportAttribute. Se volete sapere quando tutte le importazioni hanno finito, basta implementare l'interfaccia IPartImportsSatisfiedNotification:

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

    ...

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

Questo richiede più o meno di utilizzare MEF per garantire che il ViewModel viene creata un'istanza in modo corretto, ma a seconda dello scenario che non può essere un grosso problema.

Altri suggerimenti

A:. Abe Heidbrecht

Sono poco confondere. Se io uso questo:

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

A causa.

IPartImportsSatisfiedNotification ha solo un unico metodo:. OnImportsSatisfied, che viene chiamato quando tutte le importazioni che potrebbero essere soddisfatte sono stati soddisfatti

Credo che sia meglio per le interfacce di init di unit test di classe servizi in funzione di costruzione della classe di vista del modello.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top