Зафиксировать правило фабрик и билдеров в код-стайле
ci / build-test (pull_request) Successful in 2m49s
ci / build-test (pull_request) Successful in 2m49s
This commit is contained in:
@@ -103,6 +103,25 @@
|
||||
- Асинхронность: суффикс `Async`, `CancellationToken` пробрасывать до конца; `.Result` / `.Wait()`
|
||||
запрещены — только `await`.
|
||||
|
||||
### 4.1. Фабрики и билдеры
|
||||
|
||||
- **Нетривиальные объекты с интерфейсом создаются только фабриками.** Реализация сервиса/адаптера,
|
||||
у которого есть порт-интерфейс, не создаётся прямым `new` в прикладном коде или композиционном корне —
|
||||
только внутри фабрики. Форма пары: `IXxxFactory` (порт фабрики) + `XxxFactory` (реализация), метод
|
||||
`Create(...)` возвращает **интерфейс** готового объекта (`ISecretCipher`, `IFileStorage`, …).
|
||||
- Фабрика сама регистрируется в DI (`AddScoped`/`AddSingleton<IXxxFactory, XxxFactory>()`) — контейнер
|
||||
конструирует её без `new`; зависимости фабрики — тоже DI.
|
||||
- **Билдер** (`IXxxBuilder`/`XxxBuilder`) добавляется, когда объект собирается итеративно из многих частей
|
||||
или опций; фабрика делегирует сборку билдеру, а не повторяет её.
|
||||
- Исключения из правила (прямой `new` допустим):
|
||||
- DTO, рекорды, value-объекты, `Options`/`Settings`-снимки;
|
||||
- исключения (`*Exception`) и примитивы/BCL-типы (`StringBuilder`, `NpgsqlConnection`, `MinioClient`, …);
|
||||
- статические классы и хэлперы без состояния (фабрику для них не заводим);
|
||||
- EF-конфигурации (`IEntityTypeConfiguration`) — это метаданные модели, а не прикладные объекты;
|
||||
- обёртки ресурсов без порт-интерфейса (gRPC-соединения с `IDisposable`);
|
||||
- объекты без порт-интерфейса, создаваемые контейнером (`AddScoped<Concrete>()`).
|
||||
- Тесты могут конструировать проверяемый тип прямым `new` — это часть самого теста, а не прикладного кода.
|
||||
|
||||
## 5. Комментирование кода
|
||||
|
||||
Все комментарии — на русском языке.
|
||||
|
||||
Reference in New Issue
Block a user