Я пытаюсь структурировать приложение с использованием DDD и луковой/гексагональной/чистой архитектуры (с использованием Java и Spring). Мне легче найти руководство по самим понятиям, чем на самом деле, как их реализовать. DDD, в частности, кажется довольно сложным, чтобы найти примеры, которые поучительны, потому что каждая проблема уникальна. Я видел многочисленные примеры SO, которые были полезны, но у меня все еще есть вопросы. Интересно, сможет ли мой пример помочь мне и всем остальным.Пример структуры DDD
Надеюсь, вы можете простить меня, задав здесь несколько вопросов. Пример кажется слишком большим, чтобы я мог повторить его в нескольких вопросах.
Контекст:
У нас есть приложение, которое должно отображать информацию о статистике футбола и имеет следующие понятия (для простоты я не включал все атрибуты):
- Team, которая имеет много Игроки.
- Игрок.
- Светильник, в котором две команды и 2 половины.
- Половина, которая имеет 2 образованияPlayed и много комбинаций.
- FormationPlayed, который имеет много PositionsPlayed.
- PositionPlayed, в котором есть 1 Player и объект значения позиции.
- Комбинация, которая может быть двух типов и имеет много перемещений.
- Перемещение, которое может быть двух типов, имеет 1 игрока и объект значения события.
Как вы можете себе представить, попытка выяснить, какие вещи являются совокупными корнями, здесь сложна.
- Команда может существовать независимо, а именно AR.
- Игрок может существовать независимо, поэтому AR.
- Светильник, при удалении, должен также удалить его половинки, так что это AR.
- Половина должна быть сущностью в Приспособлении.
- FormationPlayed должен быть удален, если половина удалена, поэтому, возможно, это должно быть подразделение в Half.
- PositionPlayed должен быть удален, когда формация удалена, поэтому верьте, что это должно быть лицо в FormationPlayed.
- Комбинация в определенном смысле может существовать независимо, хотя и привязана к определенной половине игры. Возможно, это может быть AR, связанный в конечном итоге.
- Перемещение должно быть удалено при удалении комбинации, поэтому верьте, что это должно быть сущность в комбинации.
Вопросы:
- Видите ли вы какие-либо ошибки в приведенной выше конструкции? Если да, то что бы вы изменили?
- Светильник - Half-FormationPlayed - PositionPlayed aggregate кажется слишком большим, поэтому я задаюсь вопросом, согласитесь ли вы, что это можно разделить на Fixture - Half и FormationPlayed - PositionPlayed, используя возможную последовательность.Я не могу найти пример того, как это реализовано на Java? Если Fixture были удалены, вы можете запустить событие FixtureDeleted, которое также приведет к удалению его соответствующих объектов FormationPlayed?
- Я хочу построить модель домена, которая не понимает, как она будет сохраняться (согласно архитектуре лука). Мое понимание заключается в том, что объекты домена здесь не должны иметь суррогатных ключей, поскольку это относится к упорству. Я также считаю, что объекты должны ссылаться только на объекты в других агрегатах с помощью идентификаторов. Как тогда, например, был бы PositionPlayed reference Player в модели домена?
- Первоначально целью является только разрешение клиенту получать данные и отображать их. В конечном итоге я хочу, чтобы клиенты могли выполнять сами CRUD, и я хочу, чтобы все инварианты удерживались вместе моделью домена, когда это происходит. Будет ли упрощено (и вы можете показать мне или указать мне пример, объясняющий, как) иметь две модели домена, одну для поиска данных и одну богатую для операций, которые будут выполняться позже? Два БК, как это было. Причина, по которой я спрашиваю, заключается в том, что модель с богатым доменом кажется довольно трудоемкой, когда мы сначала хотим отображать статистику в базе данных, но я также не хочу создавать проблемы для себя по линии, если лучше создайте одну богатую доменную модель в настоящее время с учетом предполагаемых позже. Интересно, если бы я создал только упрощенную модель для извлечения данных, какие концепции в DDD можно было бы игнорировать (мне бы, например, пришлось разбить большие агрегаты?)
Я надеюсь, что все это имеет смысл , Очевидно, рад объяснить, если потребуется. Поймите, я прошу много здесь, и я, возможно, путал некоторые идеи. Любые ответы и мудрость, которые вы можете дать этому, будут очень признательны!
«Могут существовать независимо», как правило, превзойдены более сложными инвариантами домена, транзакционным анализом и вопросами производительности в реальных ситуациях. Объекты домена не являются статическими объектами, большая часть логики домена связана с более подробными сведениями о том, как они могут быть переведены из одного состояния в другое. Синхронизация между сущностями также является большим вопросом, который влияет на дизайн. Я предлагаю прочитать/посмотреть что-нибудь в Vaughn Vernon на предмет совокупного дизайна. – guillaume31
Спасибо @ guillaume31. Ясно, что вы хорошо разбираетесь в этом вопросе. Да, я рассмотрел ряд переговоров Вон Вернона по этому вопросу - которые являются блестящими, но поскольку каждая проблема уникальна, я все еще немного смущен, как реально реализовать то, что он говорит. У меня очень мало рекомендаций по этому вопросу, кроме книг, переговоров, репозиториев и ответов, которые я могу найти в Интернете. То, что я имею в виду под этим, - это общий разговор или пример, найденный поиском, может только зайти так далеко в решении конкретной проблемы. –
@ guillaume31 Считаете ли вы, что в этом случае правильная модель доменов правильная, и знаете ли вы какие-либо другие конкретные ссылки, которые могут быть полезны для этого конкретного случая? –