Вот как я организовывал свои проекты MVVM с LINQ:
Модель - Я думаю о Модели как о состоянии системы. Он предоставляет интерфейс для данных и отслеживает состояние системы. Модель не знает о ViewModel или View - она просто предоставляет открытый интерфейс для своих данных и различных событий, чтобы потребители (обычно ViewModels) знали, когда изменилось состояние.
ViewModel - ViewModel отвечает за организацию или структурирование всех данных, необходимых для представления, отслеживание состояния представления (например, выбранной в данный момент строки сетки данных) и реагирование на действия в представлении (например, нажатия кнопок). Он знает, что для представления нужно , но на самом деле он не знает о представлении.
Вид - Вид - это фактический внешний вид пользовательского интерфейса. Он содержит все встроенные и настраиваемые элементы управления, их расположение и стиль. Он знает о ViewModel, но только с целью привязки к его свойствам.
Шлюз - Это часть, которая напрямую касается вашего вопроса. Шлюз (по сути, это мой способ сказать «DataAccessLayer») - это отдельный отдельный слой. Он содержит весь код (включая запросы LINQ) для CRUD или выбора, вставки, обновления и удаления данных из / в ваш источник данных (база данных, файл XML и т. Д.). Он также предоставляет открытый интерфейс для Модели, позволяя модели сосредоточиться на поддержании состояния системы, не заботясь о деталях (то есть запросах), необходимых для обновления источника данных.
Классы DataAccess - В C # это очень простые классы, которые моделируют ваши элементарные объекты данных. Когда вы выбираете что-то с помощью запроса LINQ, вы обычно создаете IEnumerable<T>
или List<T>
, где T
является одним из ваших объектов данных. Примером объекта данных будет:
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
Большим преимуществом такого дизайна является то, что он действительно разделяет ваши заботы. У всего есть специализированная работа, и (обычно) довольно легко узнать, что и куда идет.
Недостатком является то, что это может быть излишним для небольших проектов. В итоге вы создаете много инфраструктуры для общедоступных интерфейсов, которые в основном пропускают одно желание через несколько уровней. Таким образом, у вас может получиться такой сценарий: [пользователь нажимает Submit, ViewModel сообщает Model для AddNewPerson, Model сообщает Gateway to InsertPerson] вместо такого сценария [пользователь нажимает Submit, ViewModel добавляет новую запись в базу данных напрямую].
Надеюсь, это поможет.