![269049.jpg](https://v21.skladchik.org/data/avatars/m/269/269049.jpg?1511961597)
Урок 1. Продумывание идеи и проектирование проекта
Какие бывают проекты и как придумать идею для проекта?
Конкретные примеры идей
Определяем функционал веб-приложения
Проектирование предметной области
Модули. Как правильно разделить проект на модули
Как устанавливать связь между модулями
Cohesion, что это и для чего нужно
Coupling, что это и для чего нужно
Урок 2. Проектирование REST API
Проектирование REST API. Что такое REST API?
Создание ресурса, метод POST
Получение ресурса, метод GET
Зачем иногда следует использовать POST вместо GET
Получение ресурса по ID
Обновление ресурса
Удаление ресурса
Важные правила при проектировании REST API
Проектирование более сложных endpoint'ов
Урок 3. Выбор архитектуры для проекта: монолит, модульный монолит, микросервисы
Какую архитектуру выбрать для проекта? Монолит, модульный монолит, микросервисы
Монолитная архитектура
Модульный монолит
Микросервисная архитектура
Урок 4. Чистая архитектура
Чистая архитектура, что это и зачем нужно?
Какие раньше были архитектуры?
Что такое бизнес логика?
Основные концепции чистой архитектуры
Слои в чистой архитектуре. Первый слой - Entities
Внешние слои
Пример проекта с чистой архитектурой
Урок 5. Создание репозитория и проекта, создание основных сущностей
Создание репозитория
Создание проекта
Добавление .gitignore
Создание канбан доски для задач
Работа с ветками и задачами
Создание доменного проекта
Создание моделей в предметной области
Почему GUID а не long?
Анемичная и богатая модель
Связи между моделями и модулями
Прямая ссылка или Guid
Решение проблемы nullable reference
Древовидная структура, parent - children
Проектирование других сущностей
Урок 6. Настройка проекта: editorconfig, stylecop. Создание контроллера
Коммит и пуш изменений, пуллреквест и мерж
Создание Asp Net Core проекта
Создание слоя Presenters с контроллерами
Настраиваем swagger и open api
Editorconfig и stylecop, анализатор кода
Directory.Build.props для чего нужен
Проект WEB против Presenters
Методы в контроллере на практике
ActionResult и статус коды
Параметры в методах контроллера [FromBody] и другие
DTO модели
Проект с контрактами
Пишем остальные HTTP методы на практике
Получение данных. HTTP GET метод
Обновление данных. HTTP PUT метод
Удаление данных. HTTP DELETE метод
Другие HTTP методы для различных фич
Урок 7. Application слой
Коммит и пуш изменений
Формируем задачу, работа с Application слоем
Документация enum'ов
Зачем нужен Application слой
Создание Application слоя на практике, установление зависимостей
Создаём первый сервис. Что такое сервис
Какие параметры должен принимать сервис
Формируем бизнес сценарий в сервисе
Создание сущности в сервисе
Как работать с базой данных в Application слое. Dependency inversion принцип.
Что такое репозиторий и зачем он нужен
Какие модели использовать для работы с базой данных? Domain vs DTO vs Datamodels
Почему нужно начитать разработку с интерфейсов?
Какие должны быть папки в проекте? Как распределить файлы по папкам
Как писать логи
Работа с валидацией. Основные концепции. Где должна быть валидацияВалидация входных параметров. Валидация бизнес логики
FluentValidation, как пользоваться библиотекой?
Валидация бизнес логики. Правила в сценариях
Как использовать сервисы в контроллерах
Как и где правильно регистрировать зависимости
Урок 8. Инфраструктурный слой
Инфраструктурный слой, что это и для чего нужен
Создание инфраструктурного слоя для базы данных
Инверсия зависимостей, объясняю на примере
Нужно ли использовать репозитории
Пример как можно реализовать сидирование
Что ещё может быть в инфраструктуре? Примеры инфраструктурных слоёв
Как регистрировать инфраструктуру в DI? Extension методы
Подвожу итоги по инфраструктуре
Урок 9. Работа с ошибками, как правильно работать с Exceptions
Почему важно правильно работать с ошибками
Создание кастомных Exceptions
Класс Error и Shared проект. Правильно работаем с ошибками
Как вернуть ошибки валидации с помощью Exception
Как правильно обрабатывать ошибки, Exception middleware
Почему Exceptions это не всегда хорошо
Урок 10. Result паттерн
Когда нужно использовать Exceptions
Когда нужно использовать Result паттерн
Зачем нужен Result паттерн, что это такое
Самая простая реализация Result паттерна с помощью кортежей
Класс Result, пример его использования
Result, как вернуть значения из Result
Неявное преобразование
Библиотека CsharpFunctionalExtensions
Возвращаем список ошибок
Кастомная коллекция Failure
Возвращаем список ошибок
Пример кода с try catch + Result
Метод расширения для красивого ответа клиенту, статус коды
Урок 11. Реализация других бизнес фич
Метод AddAnswer
Что должен возвращать метод в сервисах
Документация методов, summary
Добавляем нужные зависимости и начинаем писать логику метода, валидация
Два способа, как добавлять дочернюю сущность в базу данных
Первый способ, если используете Dapper
Что может пойти не так в бизнес сценарии, откуда берутся баги
Как управлять транзакцией в Application слое, TransactionManager
Второй способ добавления дочерней сущности в базу данных
Добавляем новые бизнес правила и усложняем метод
Как обратиться к другому модулю в разных случаях, новый инфраструктурный слой
Урок 12. Разделение сервиса на обработчики (Hanlders)
Разделение сервиса на части
Как правильно назвать обработчик
Вынесение фичи в отдельный класс
Создание папок для фич, удобный способ
Общий интерфейс для обработчиков
Паттерн команда (command), что это такое и зачем нужны команды
ICommandHandler
ICommand, улучшение интерфейса
Как в контроллере правильно вызвать Handler
Как удобно зарегистрировать все обработчики в DI
Scrutor, расширяем возможности Dependency Injection
Получение данных
Урок 13. Получение данных из бд и других источников
Как получать данные?
Пишем фичу на получение данных с фильтрами
Какие модели возвращать из бэкенда? Создаём DTO
Получаем данные с помощью репозитория, способ первый
Получаем связанные данные из другого хранилища, пример с файлами
Extension метод для Enum, из Enum в строку
Минусы использования репозитория для получения данных
Второй способ, использование DbContext в Handler
Как использовать DbContext в Application
IQueryable в DbContext
Пишем запросы в Handler с помощью DbContext
Паттерн CQS, разделение операций на запись и чтение
Добавление IQuery и IQueryHandler
Что если мы не используем EF Core, а используем Dapper
Урок 14. Модульный монолит
Рассматриваем обычное монолитное решение
Как будет выглядеть модульный монолит
Меняем структуру проекта, создаём новые проекты
Показываю как должен выглядеть модульный монолит
Проект Shared
Папка Infrastructure
Остальные проекты в Core
Пример модуля Questions
Архитектура Vertical Slice Architecture для небольших модулей
Minimal API для фич
Как регистрировать ендпоинты в Minimal API
Взаимодействие между модулями с помощью контрактов
Как регистрировать DI в модулях
Урок 15. Github actions
Пушим прошлую задачу в github
Настриваем Github actions