Oto jak ja organizuje mój MVVM w/projektów LINQ:
model - myślę o model, stan systemu. Zapewnia interfejs do danych i śledzi status systemu. Model nie wie o ViewModelu ani widoku - zapewnia jedynie publiczny interfejs do danych i różnych zdarzeń, aby konsumenci (zwykle ViewModels) wiedzieli, kiedy stan się zmienił.
ViewModel - ViewModel jest odpowiedzialny za organizację i struktury wszystkich danych wymaganych przez View, śledzenie statusu widzenia (jak aktualnie zaznaczonego wiersza siatki danych), oraz reagowanie na działania na widoku (np. naciśnięcia przycisków). Wie, jaki musi być widok, ale w rzeczywistości nie wie o widoku.
Wyświetl - Widok jest rzeczywistym wyglądem interfejsu użytkownika. Zawiera wszystkie wbudowane i niestandardowe elementy sterujące, sposób ich rozmieszczenia i styl. Wie o modelu ViewModel, ale tylko w celu powiązania z jego właściwościami.
Gateway - To jest część, która bezpośrednio odpowiada na twoje pytanie. Brama (która jest w zasadzie moim sposobem powiedzenia "DataAccessLayer") jest osobną warstwą. Zawiera cały kod (w tym zapytania LINQ) do CRUD lub wybierz, wstaw, aktualizuj i usuń dane z/do twojego źródła danych (bazy danych, pliku XML itp.). Zapewnia także publiczny interfejs do Modelu, umożliwiając modelowi skupienie się na utrzymywaniu stanu systemu bez konieczności zajmowania się szczegółami (tj. Zapytaniami) potrzebnymi do aktualizacji źródła danych.
DataAccess Classes - W języku C# są to bardzo proste klasy, które modelują twoje elementarne obiekty danych. Gdy wybierzesz coś za pomocą zapytania LINQ, zwykle utworzysz IEnumerable<T>
lub List<T>
, gdzie T
jest jednym z twoich obiektów danych. Przykład obiektu danych to:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Wielką zaletą takiego projektu jest to, że naprawdę oddziela twoje obawy. Wszystko ma wyspecjalizowaną pracę i (zazwyczaj) dość łatwo jest wiedzieć, o co chodzi.
Wadą jest to, że może to być przesada w przypadku małych projektów. W efekcie powstaje wiele infrastruktury dla publicznych interfejsów, które w zasadzie przekazują jedno życzenie przez kilka warstw. Tak więc możesz skończyć scenariuszem podobnym do tego: [użytkownik klika Submit, ViewModel mówi Modelowi do AddNewPerson, Model mówi Gateway to InsertPerson] zamiast takiego scenariusza [użytkownik klika Submit, ViewModel dodaje nowy rekord bezpośrednio do bazy danych].
Nadzieję, że pomaga.
Czasem przykładowy kod jest napisany w celu zilustrowania punktu. Kod produkcji powinien być napisany tak, aby można go było utrzymywać i rozumieć. – Min