Делать контексты явными в структуре каталогов
Я ищу отзывы о определенной структуре каталогов для приложения. Я понимаю, что это не соответствует классическому формату переполнения стека, где есть такая вещь, как "правильный ответ", хотя, тем не менее, думаю, что это интересно. Чтобы обеспечить содержательную обратную связь, сначала необходимо понять некоторый контекст, поэтому, пожалуйста, потерпите меня.
-
Мы с двумя коллегами создали приложение, которое использует Чистую Архитектуру. HTTP-запросы к маршрутам превращаются в модели запросов, которые передаются в сценарии использования, которые затем выдают модель ответа, которая передается докладчику.
Код полностью с открытым исходным кодом и может быть найден на GitHub. У нас также есть несколько документов, описывающих основные каталоги.
Мы думаем о реорганизации нашего кода и хотели бы получить отзывы о том, что мы придумали до сих пор. Главными из причин этой реорганизации являются:
В настоящее время у нас нет подходящего места для размещения вещей, которые не являются частью нашего домена, но каким-то образом связаны с ним. Например, код авторизации, который знает об идентификаторах пожертвований (с авторизацией, не являющейся частью основного домена, в то время как идентификаторы пожертвований являются).
Приятно группировать сплоченные вещи вместе. Наш код пожертвования является целостным, а код заявки на членство - единым, хотя оба они не зависят друг от друга. Это тесно связано с понятием ограниченного контекста в управляемом доменом дизайне. Сейчас эти контексты явно не видны в нашем коде, поэтому легко сделать их зависимыми друг от друга, особенно когда вы не знакомы с доменом.
Это контексты, которые мы определили до сих пор. Это предварительный список, просто чтобы дать вам идею, а не ту часть, о которой я хочу услышать отзывы.
- дарение
- членство
- Форма поддержки (проверка электронной почты, генерация IBAN и т. Д.)
Часть, о которой я хочу узнать, - это структура каталогов, на которую мы думаем перейти:
src/
Context_1/
DataAccess/
Domain/
Model/
Repositories/
UseCases/
Validation/
Presentation/
Authorization/
Context_2/
Factories/
Infrastructure/
tests/
Context_1/
Unit/
Integration/
EdgeToEdge/
System/
TestDoubles/
Context_2/
Authorization/
папка, находящаяся непосредственно внутри контекста, станет домом для нашего в настоящее время странно размещенного кода авторизации в инфраструктуре. Другой код, не являющийся частью нашего домена, но привязанный к нему, может перейти непосредственно в контекстную папку и получить свою собственную папку, если в ней есть связная связная информация, такая как авторизация.
Я рад предоставить дополнительную информацию, необходимую для предоставления полезных отзывов.
1 ответ
В настоящее время у нас нет подходящего места для размещения вещей, которые не являются частью нашего домена, но каким-то образом связаны с ним.
Сейчас эти контексты явно не видны в нашем коде, поэтому легко сделать их зависимыми друг от друга, особенно когда вы не знакомы с доменом.
Существуют как технические, так и нетехнические способы решения этой проблемы:
- Вы можете обеспечить более строгое разделение через библиотеки классов. Более очевидно, что вы берете зависимость от чего-либо, если вам нужно импортировать dll / ссылаться на другой проект. Это также предотвратит циклические зависимости.
- Проверка кода / дисциплина - нетехнический способ справиться с этим.
Я использую шестиугольную архитектуру с DDD, где домен находится посередине. Другие проблемы, такие как хранилища, представлены интерфейсами. Затем ваши адаптеры обращаются к домену, но никогда в другом направлении. Таким образом, у вас может быть IRepository в вашем домене, но ваш WhwhatDatabaseRepository находится в своем собственном проекте. В этом случае службы приложений / обработчики команд должны координировать ваши сценарии использования и загружать адаптеры. Это также, где вы могли бы применять сквозные вопросы, такие как авторизация.
Я бы порекомендовал посмотреть видео Грега Янга (попробуйте это) и прочитать IDDD Вона Вернона, чтобы узнать, как структурировать приложения и решать такие вопросы, как ваш. (извините, что мой ответ в основном - посмотреть 6-часовое видео и прочитать книгу на 600 страниц, но они оба действительно помогли мне прояснить некоторые "шерстистые" аспекты DDD)
В качестве примера см. https://github.com/gregoryyoung/m-r/blob/master/SimpleCQRS/CommandHandlers.cs