Билет не будет иметь ссылку на хранилище. Он будет иметь отношение один к одному с TicketState, а TicketRepository просто сделает JOIN и отобразит значения в Ticket.
Когда я создаю объекты модели, я обычно не информирую их о том, являются ли они постоянными или нет, поэтому они не внедряются в репозиторий. Репозиторий обрабатывает все операции CRUD.
Некоторые люди возражают против этого, говоря, что это приводит к модели анемичной области ; возможно ты один из них. Если это так, вставьте репозиторий в объект Ticket, но просто попросите его выполнить JOIN и вернуть Ticket с заполненным состоянием. При вставке или обновлении необходимо изменить две таблицы как одну единицу работы, поэтому убедитесь, что транзакции включены.
Причина, по которой мне нравится использовать CRUD вне объекта модели домена, заключается в том, что он обычно не является единственным объектом домена, участвующим в сценарии использования или транзакции. Например, возможно, в вашем простом сценарии использования «купить билет» будет объект «Билет», но могут быть и другие объекты, связанные с бронированием и размещением, а также с общей бухгалтерской книгой, инвентаризацией багажа и другими вещами. Вы действительно хотите сохранить несколько объектов модели как одну единицу работы. Только уровень сервиса может знать, когда объект модели действует сам по себе, и когда он является частью более крупного, грандиозного плана.
Обновление:
Еще одна причина, по которой мне не нравится идея внедрения объекта модели с помощью DAO, чтобы он мог обрабатывать постоянные обязанности, - это уничтожение слоев и циклическая зависимость, которую он вводит. Если вы сохраняете модель чистой от любых ссылок на классы постоянства, вы можете использовать их, не вызывая другой слой. Это односторонняя зависимость; Постоянство знает о модели, но модель не знает о постоянстве.
Введите постоянство в модель, и они циклически зависят друг от друга. Вы никогда не сможете использовать или тестировать ни одно без другого. Без наслоений, без разделения интересов.