Как архитектурно правильно реализовать получение данных из БД и передачу в модель?
Изучаю 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 шт):
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
, если она там не требуется. И наоборот, если вам нужно вывести дату создания или последнего обновления какой-то записи, вам ничего не мешает это сделать, поскольку эти данные входят в набор данных для описания страницы/окна