pattern MVVM: il miglior approccio di progettazione per gestire un'applicazione

0

Un anno fa, ho scoperto la tecnologia WPF e ho sviluppato una piccola applicazione , come primo esperimento, per confrontare il contenuto di due diverse directory. Il contenuto di ciascuna directory è mostrato in un DataGrid diverso. A quel tempo, non ho sviluppato l'applicazione utilizzando il pattern MVVM, perché era solo un esperimento, non così buono, ma ha funzionato.

Ora che ho molta più esperienza con WPF e con gli schemi di progettazione, non sono così orgoglioso di quel lavoro, e voglio riscrivere l'applicazione, migliorandola e seguendo il modello MVVM consigliato.

In realtà, ho progettato l'applicazione in questo modo:

  • il MainModel, con l'algoritmo comune principale.
  • il MainView è la vista unica dell'applicazione con i datagrids in cui posso mostrare i risultati dei miei algoritmi.
  • a MainViewModel, che si occuperà di gestire la connessione tra altri due ViewModels, MainModel e MainView.
  • One ViewModel per ogni DataGrid. In questo modo, separerò il comportamento e i dati dei due DataGrid.

Il MainModel contiene l'algoritmo principale utilizzato per cercare i file in una determinata directory, come questo:

public class MainModel
{
    public MainModel()
    {}

    public List<Results> GetFiles(string directoryPath)
}

Il MainViewModel istanzia un oggetto per ogni ViewModel (ho un ViewModel per ogni datagrid), usando alcune proprietà per farlo:

public class MainViewModel
{
    public MainViewModel()
    {
        FirstViewModel = new ViewModelDG1();
        SecondViewModel = new ViewModelDG2();
    }

    public ViewModelDG1 FirstViewModel
    {get;set;}

    public ViewModelDG2 SecondViewModel
    {get;set;}
}

Volevo applicare un modello di progettazione per aiutarmi a gestire l'applicazione, come un metodo di fabbrica o Builder o un metodo di template , ma penso che non siano adatti alla mia applicazione per i diversi usi / condizioni di questi modelli di design.

Non sono così sicuro di questo design, non so se questo è l'implementazione corretta del pattern MVVM e se promuove un accoppiamento lento e un'elevata coesione. Puoi aiutarmi nel design? La mia è una corretta implementazione di MVVM? Se no, allora qual è quella corretta? Quali sono le tue opinioni?

Grazie.

    
posta Alberto Solano 14.07.2013 - 18:00
fonte

2 risposte

4

Alberto, circa un anno e mezzo fa ero dove sei ora, e ho imparato molto su MVVM, WPF e Programming Meta Skills lungo la strada.

Per il momento, mi asterrò dal rispondere alle tue domande in modo specifico, e mi piacerebbe ottenere alcune parole che sono di interesse generale / guida, se vuoi.

MVVM è un modello di progettazione / architettura che richiede un po 'di tempo per abituarsi. Non esiste un modo giusto o corretto, MVVM è praticato in molti gusti diversi senza alcun code code da un lato, e un approccio più "simile a un modello di vista" (con una certa quantità di code-behind consentito) su l'altra parte. Come per molte cose nell'IT, questo argomento confina anche con il piacere personale.

Non fare l'errore che ho fatto provando a inserire pattern (o il design di qualcun altro) per motivi di fantasia. Riconosci i tuoi problemi specifici e prova a risolverli uno alla volta. Guarda come gli altri esperti di WPF / MVVM stanno risolvendo e costruiscono cose. Riconoscendo un problema e trovando un modo per risolverlo, impari a memoria le tue abilità MVVM / WPF. Molti piccoli passaggi ti porteranno nella giusta direzione più velocemente di qualsiasi accanito approccio "Sto cercando di ottenere questo 100% corretto per la prima volta".

Ora alla tua domanda:

Non riesco a vedere alcun problema con il tuo approccio finora. Le uniche cose su cui vorrei commentare sono:

  1. Crea un'istanza delle tue VM tramite il caricamento lento, in modo da consumare memoria / tempo di elaborazione solo su richiesta. Inoltre, se stai consentendo di ri-impostare gli oggetti del tuo modello di vista (vedi i setter), assicurati che la classe del contenitore implementa INotifyPropertyChanged.

    public ViewModelDG2 SecondViewModel {     ottenere {return _viewModelDG2 ?? (_viewModelDG2 = new ViewModelDG2 ()); } }

  2. Per quanto riguarda la tua preoccupazione di "accoppiamento lento": Quella riguarda maggiormente la fornitura di interfacce alla tua specifica implementazione (classi). Se la vista viene creata in un assembly diverso, potrebbe avere senso operare tramite le classi interne e le interfacce pubbliche.

Risorse che posso consigliare vivamente a te:

Best!

    
risposta data 14.07.2013 - 20:57
fonte
0

Ciao, penso che sia troppo tardi per rispondere a questa domanda, ma penso che possa essere utile per gli altri che cercano lo stesso contenuto.

secondo me il miglior approccio al design dovrebbe essere.

La tua applicazione ha una cartella sotto menzionata

1.Resources

2.Models

3.ViewModel

4.View

5.ServiceAgent // Che viene utilizzato per ridurre l'iniezione delle dipendenze

6.Libs

Ok, tutte le viste della tua applicazione devono terminare con Nome vista. e.c MainPage è il tuo xaml quindi il nome dovrebbe essere MainPageView.xaml

Tutti come Viewmodels e modelli.

La tua cartella Viewmodel contiene un ViewmodelLocator che è usato per inizializzare tutti i Viewmodel che sono usati nella tua applicazione.

devi creare l'oggetto del locator Vuewmodel nel file App.xaml e utilizzarlo come una risorsa statica

e.c

xmlns:vm:"Your ViewModel namespace"



<resource><VM:YourViewModelLocatorName X:key="Key Name" /></resource> 

La tua vista Datacontext dovrebbe essere

Datacontext="{Binding ViewModelName, Source=" {StaticResource KeyName} "

Grazie

    
risposta data 12.08.2013 - 11:42
fonte

Leggi altre domande sui tag