Как архитектурно правильно реализовать получение данных из БД и передачу в модель?

Изучаю WPF с применением MVVM.

Модель это обычно данные, которые необходимы для UI, и некоторые методы работы с этими данными. Для доступа к данным будет создан отдельный проект. По идеи этот уровень ничего не должен знать о сущностях модели.

Есть класс Teacher и TeacherGroup (должности, которые учитель занимает, например, физик и математик).

Teacher.cs:

public class Teacher
{
    public int Id { get; set; }
    public string FullName { get; set; }
    public List<TeacherGroup > Groups { get; set; }
}

TeacherGroup.cs:

public class TeacherGroup
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Это сущности модели, которые нужны View.

Как правильно получить эти данные из БД и передать в модель (заполнить сущность) именно архитектурно? Сделать какие-то классы DTO или доп. библиотеку что-то типо ObjectModel, к которой будет доступ у всех уровней?

В DAL планировал сделать метод что-то типо GetCurrentTeacher, который из базы будет получать данные о текущем учителе и группах, в которые он входит.

Если можно, то хочу получить объяснение с примерами, пожалуйста.


Ответы (1 шт):

Автор решения: Faraday

Data Access Layer

Уровень доступа до БД оперирует только сущностями базы данных, т.е. единица для передачи данных на этом уровне это Entity. Среди прочего, в основном тут размещён контекст и различные репозитории.

Service Layer (Business Logic Layer)

Более известный как бизнес-слой. На этом уровне, кроме сервисов, так же определяются различные Dto для передачи информации между сервисами, а так же Мапперы. Сервис, отвечающий за работу с сущностью A должен определять преобразование в AModel. Далее работа с данными осуществляется уже с Dto

Core Layer (Application Layer)

Слой, с которым взаимодействует юзер напрямую. Предыдущие слои, которых может быть на много больше, являют собой некий механизм обработки данных, который вы можете использовать, к примеру, не только для WPF, а и для других фреймворком или проектов типа WinForms или asp.net. Всё, что вам нужно это просто подключить нужные библиотеки и всё. Целевой слой уже определяет, какие данные нужно для описания той или иной страницы либо окна и определяет такой элемент как Model

UPD: Сама структура и архитектура проекта это дело каждого, но принято хотя бы придерживаться её наличию) Основна логика, которой вы должны оперироваться строится на двух правилах

  • Каждый слой должен получить минимальный набор данных, с которым он сможет выполнить полагаемую на него задачу
  • Каждый слой не должен получить больше данных, чем предполагает сам слой приложения

Для вашего проекта, лично я бы сделал следующий план:

  • В DAL создаём нужные Entities, DbContext реализацию GenericRepository
  • В BLL создаём сервисы TeacherService и TeacherGroupService
  • Для каждого сервиса делаем свой набор Dto в подпапке Models
  • (Опционально) ставим AutoMapper и закидывай профили для маппинга в подпапдку Mappers
  • Инжектим DbContext в сервисы
  • Вытягиваем Entity
  • Маппим в Dto
  • В Application Layer инжектим нужные сервисы
  • Создаём папку ViewModel и своответствующие модели
  • Подпапка Mapping в маппинг профилями
  • После вызова метода сервиса маппим результат в ViewModel и возвращаем на страницу/окно

UPD2: На счёт правил, которые нужно придерживаться. Тут имеется ввиду, что вам не нужно передавать параметры, типа PrimaryKey, CreatedAt, DeletedAt и так далее, в ViewModel, если она там не требуется. И наоборот, если вам нужно вывести дату создания или последнего обновления какой-то записи, вам ничего не мешает это сделать, поскольку эти данные входят в набор данных для описания страницы/окна

→ Ссылка