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