Всем привет, я читаю книгу Р. Мартина "Чистая архитектура". В ней приводится такая структура приложения:

Я разрабатываю телеграмм бота для автоматизации рассылок инстаграм. У меня получилась следующая структура: Сущности: User, Instagram, Work(сущность фоновой задачи), интерфейсы вариантов использования, доступа к данным и тд. Сущности не требуют в себе никакой критической бизнес логики, просто структуры данных. От сущностей зависит проект с бизнес логикой (варианты использования, далее: слой с бизнес логикой). Там определены сервисы ответа на команды ботом, запуск задач, оплата и тд. От бизнес логики зависят несколько компонентов, они все реализуют интерфейсы, определенные в сущностях. Это доступ к данным, отправка запросов телеграмму, инстаграму, работа с платежной системой, компонент MVC.
Вопрос заключается в чем.
- Правильно ли хранить все интерфейсы в сущностях, или интерфейсы для доступа к данным к примеру должны находиться в проекте с бизнес логикой?
- Детали (тот же проект доступа к данным) должны общаться с слоем с бизнес логикой с помощью DTO. Где их хранить? В Сущностях или в слое с бизнес логикой?
- Может ли бизнес логика контактировать с деталями (компоненты, зависящие от нее) с помощью сущностей? К примеру репозиторий будет возвращать объекты сущностей из бд? Или для них нужно создавать отдельные DTO (InstagramDTO, UserDTO...) и при необходимости мапить их в сущности в слое с бизнес логикой.
- И вообще, может ли слой с бизнес логикой зависеть от сторонних библиотек? Автомапера там, CSVHelper и тд, или все сторонние библиотеки необходимо оставить для компонентов, зависящих от бизнес логики?
- Если все интерфейсы находятся в сущностях, то может быть детали должны зависеть от сущностей, а не от слоя с бизнес логикой? В таком случае изменения в бизнес логике не потребуют согласования с компонентами (если не изменяется какая-то очень важная часть бизнес логики)?
- "Не плодите ли вы интерфейсы впустую?" А как без интерфейсов воплощать инверсию зависимостей?
- "Бизнес логика не общается с помощью DTO". А с помощью чего же она общается? К примеру контроллер, который хочет получить какую-то информацию. Он обращается к бизнес логике, которая должна ему вернуть данные, вероятно объединенные в DTO, разве нет?
- Я имел ввиду, что у есть сущность User у EntityFramework. Я могу ее смапить в доменную сущность User и вернуть, либо мне нужно для этого какая-то промежуточная DTO, которую вернет репозиторий? Я уже понял, что не нужна.
– Егор Лазеба Mar 09 '22 at 19:02А в целом большое спасибо за ответ, есть над чем подумать!
– Егор Лазеба Mar 09 '22 at 19:09