- Толстые Тупые Уродливые Контроллеры
- Tutorial: Implement CRUD Functionality - ASP.NET MVC with EF Core
- Razor Pages with Entity Framework Core in ASP.NET Core
- Просто
- Лучшая возможная производительность
- Затраты на поддержку растут с количеством кода; по закону брукса разработка в какой-то момент остановится
- Не допустить превращения кодовой базы в Big Ball of Mud
- CRUD VS Task-Based UI
- нарушение SRP
- смешение бизнес логики и инфраструктурного кода
- затруднено повторное использование
Services
,Helpers
,Managers
,...
повышается связность по мере роста проекта, в итоге имеется тенденция к Big Ball of Mud- Cross-cutting concerns
- Затруднен Feature Toggle и рефакторинг
- Конфликты при мердже, не соблуюдается принцип OCP
- Потеря контекста при навигации по файлам
- Реализовать вертикальные слайсы без использования внешних библиотек, вроде
MediatR
илиSimpleInjector
- Или применить одну из них
- CQRS. Факты и заблуждения
- Meanwhile... on the command side of my architecture
- Meanwhile... on the query side of my architecture
- Report progress and cancel long running queries
- DDD, Hexagonal, Onion, Clean, CQRS, … How I put it all together
- Меньше конфликтов
- Больше добавления и удаления кода, меньше редактирования
- Базовые хендлеры, меньше бойлерплейта
- Обобщенная обработка Cross-cutting concerns
- Больше инфраструктурного кода
- Непривычно
- Циклические зависимости
- Когнитивная сложность
- Затруднен рефакторинг
- Время компиляции, запуска
- Убрать явную зависимость от конкретной ORM
Разделить проект на модули (отдельные сборки)
- Feature modules
- Как запустить MVP и не превратить его в техдолг
- Table splitting
- Domain-driven design: рецепт для прагматика
- Зависимости инвертированы, нет циклических зависимостей
- Нет зависимостей от конкретной ORM в домене
- Видны зависимости между модулями
- Больше абстраций
- Больше инфраструктурного кода
- Нужны
Domain Events
- Борьба с NRE, частичной инициализацией
- Код определяет допустимые и недопустимые состояния объектов
- Применить инкапсуляцию
- Создать спецификации
- Удалить
<FK>Id
-properties - Определить конструкторы с параметрами
- Выделить методы сущностей
- Блеск и нищета модели предметной области
- Entity Base Class
- Value Object: a better implementation
- In Defense of Lazy Loading
- Защита от NRE
- Соблюдение инвариантов
- Лучшая читаемость кода
- Следование принципам ООП
- Возможное дублирование валидации в конструкторах и в валидаторах
- Ухудшение производительности
- Сложность моделирования
- Куда мне класть этот метод?
- Дублирование кода в валидаторах/контроллера
- Повторные загрузки сущностей
- Создание обобщенных валидаторов
- Написать фабрику контекстов
- Написать обобщенные валидаторы
- Нет повторных чтений из БД
- Обобщенная валидация
- Не используются Nullable Reference Type
- Объединить паттерн
State
и идеи функционального программирования - Запрограммировать конечный автомат
- Designing with types: Making illegal states unrepresentable
- Шаблон проектирования «состояние» двадцать лет спустя
- Комплируется - значит работает
- Переходы между состояниями и правила - явные
- Смешение ответственности между валидаторами и
State
- The CAP theorem of domain modeling
- Asynchronous Injection
- Не тестировать моки
- Перенести работу с IO в отдельный слой
- Не потерять преимущества обобщенных интерфейсов, но сохранить холистические абстракции
- Более формальные правила структурирования кода
- Упрощение тестирования
- Фрагментация логики
- Отделение
мух от котлетосновного процесса от побочных эффектов - Коммуникация между модулями
- Упрощение перехода к шине данных и микросервисам
- Аудит лог
- Запрограммировать диспетчер
- Заменить прямую работу с
DbContext
наUnitOfWork
- Domain events: design and implementation
- Better domain event pattern
- Multiple dispatch в C#
- Event storming
- Слабая связанность
- Неявность
- Управление транзакциями
- События в обработчиках событий
- Синхронные и асинхронные обработчики
- Производительность: импорт, экспорт, массовое обновление, денормализация
- Реализовать массовую операцию
- Подписаться на событие одного модуля и обработать его в другом
- Не нужно писать хранимые процедуры
- LINQ нарушает LSP