Ecco come sto organizzando il mio MVVM w/progetti LINQ:
Modello - penso al modello come lo stato del sistema. Fornisce un'interfaccia per i dati e tiene traccia dello stato del sistema. Il Modello non conosce ViewModel o View - fornisce solo un'interfaccia pubblica ai suoi dati e vari eventi per consentire ai consumatori (solitamente ViewModels) di sapere quando lo stato è cambiato.
ViewModel - Il ViewModel è incaricato di organizzare o strutturare tutti i dati necessari per la visualizzazione, tenere traccia dello stato della vista (ad esempio la riga attualmente selezionata di una griglia di dati), e rispondendo alle azioni sulla vista (come i pulsanti). Sa cosa la vista ha bisogno di, ma in realtà non conosce la vista.
View - The View è l'aspetto reale dell'interfaccia utente. Contiene tutti i controlli incorporati e personalizzati, come sono organizzati e come sono stilizzati. Conosce il ViewModel, ma solo allo scopo di legarsi alle sue proprietà.
Gateway - Questa è la parte che risponde direttamente alla tua domanda. Il gateway (che è fondamentalmente il mio modo di dire "DataAccessLayer") è il suo livello separato. Contiene tutto il codice (comprese le query LINQ) in CRUD o seleziona, inserisce, aggiorna ed elimina i dati da/verso l'origine dati (database, file XML, ecc.). Fornisce inoltre un'interfaccia pubblica al modello, consentendo al modello di concentrarsi sulla gestione dello stato del sistema senza doversi preoccupare dei dettagli (ad es. Le query) necessari per aggiornare l'origine dati.
Classi DataAccess - In C#, sono classi molto semplici che modellano gli oggetti dati elementali. Quando si seleziona qualcosa utilizzando una query LINQ, di solito si crea uno IEnumerable<T>
o List<T>
dove T
è uno degli oggetti dati. Un esempio di un oggetto di dati sarebbe:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Il grande vantaggio di un progetto come questo è che separa veramente le vostre preoccupazioni. Tutto ha un lavoro specializzato, ed è (solitamente) abbastanza facile sapere che tipo di cose vanno dove.
Lo svantaggio è che potrebbe essere eccessivo per piccoli progetti. Finisci per creare una grande infrastruttura per le interfacce pubbliche che sostanzialmente passano un singolo desiderio attraverso diversi livelli. Così, si potrebbe finire con uno scenario come questo: [l'utente fa clic su Invia, ViewModel dice Modello a AddNewPerson, Modello dice Gateway a InsertPerson] invece di uno scenario come questo [l'utente fa clic su Invia, ViewModel aggiunge direttamente un nuovo record al database].
Spero che questo aiuti.
A volte il codice di esempio viene scritto per illustrare il punto. Il codice di produzione dovrebbe essere scritto in modo che sia gestibile e compreso. – Min