Операции Read и Update: в чём подвох?

Представьте ситуацию: вы пишете приложение и у вас имеется модель данных

Листинг 1. Полная модель

В ней содержится много информации, которую хотелось бы скрыть от любопытных глаз, например LastName, Salary, Address или что-то ещё.

Что делать чтобы данные скрыть? Нужно описывать новую DTO-модель (Data Transfer Object), в которой не будет ничего лишнего.

Листинг 2. Модель Dto

И как следствие нужно писать конвертер, который будет преобразовывать Worker’a в WorkerDto.

Листинг 3. Конвертер Worker → WorkerDto

Хорошо. Описали. Какие дальнейшие проблемы возникают при внедрении всего этого в своё приложение?

Первая и очевидная – если в приложении сто моделей, значит нужно писать сто конвертеров. Вторая – если в приложении есть логика изменения данных, то нам придётся писать что-то такое:

Листинг 4. Логика обновления данных v 1.0

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

Листинг 5. Логика обновления данных v 2.0

Вспоминаем, что у нас в приложении сотни классов, значит нужно будет делать тысячи if(что-то там ≠ null)... так и выгореть можно, но на радость разработчикам есть библиотеки, выполняющие эту работу за нас – Мапперы.

Установим в свой проект библиотеку

AutoMapper https://automapper.org | https://github.com/AutoMapper

dotnet add package AutoMapperdotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection

Затем нужно сконфигурировать библиотеку. Начать нужно с объекта-наследника Profile для того, чтобы библиотека понимала, что во что нужно "превращать".

Листинг 6. Карта сопоставлений

"Собрать" экземпляр маппера

Листинг 7. Сборка маппера

и всё готово.

Теперь вместо написания конвертера Листинг 3, достаточно прописать

WorkerDto dto = mapper.Map<WorkerDto>(<worker obj>);

А вместо кода Листинг 5 достаточно этого:

Worker w = db.Find(e => e.Id == id);mapper.Map(<new data>, w);

Согласитесь, это намного ускорит процесс разработки.