Domain Driven Design - извлечение информации, связанной с сущностью из базы данных после создания объекта

Я новичок в DDD и изо всех сил пытаюсь найти правильный способ решить простую проблему.

Предположим, что я работаю над проектом, где я обрабатываю кредитные карты с использованием стороннего API, который имеет возможность попасть на терминал кредитной карты или использовать сохраненные кредитные карты для обработки платежа. У меня есть объект payment, request entity и объект token. payment имеет такие атрибуты, как payment_date, amount и т. Д., А также request_id. A token можно использовать для обхода терминала кредитной карты. Это относится к ранее использованной кредитной карте, информация которой хранится в компании по обработке кредитных карт.

При обработке возмещений мне нужно знать идентификатор терминала кредитной карты, который использовался, когда был произведен платеж, который был возвращен. Это сохраняется в таблице запросов в базе данных, если не используется токен, и терминал кредитной карты не нужен. Объект token имеет атрибут source_request_id, который указывает на запрос, который его создал. Он может получить идентификатор терминала кредитной карты из этой записи.

Соответствующие таблицы базы данных выглядят примерно так.

tblPayment.id
tblPayment.amount
tblPayment.payment_date
tblPayment.request_id

tblRequest.id
tblRequest.terminal_id
tblRequest.token_id

tblToken.id
tblToken.source_request_id

Кажется, не имеет смысла принимать удар производительности, чтобы всегда запрашивать базу данных для идентификатора терминала при создании кода payment, особенно если используется токен.

Я мог бы добавить метод getTerminalId к payment, который вытащил бы request и token из своих репозиториев и использовать их для поиска идентификатора терминала. Из того, что я понимаю, это нарушает правила DDD, хотя.

Используя DDD, как мне получить идентификатор терминала для payment?

3 голоса | спросил bconrad 26 +03002017-10-26T00:00:00+03:00312017bEurope/MoscowThu, 26 Oct 2017 00:00:00 +0300 2017, 00:00:00

1 ответ


3
  

Я мог бы добавить метод getTerminalId к объекту платежа, который вытащил бы запросы и объекты токенов из своих репозиториев и использовал их для поиска идентификатора терминала. Из того, что я понимаю, это нарушает правила DDD, хотя.

Точно, какое правило DDD вы считаете своим нарушением здесь?

Единственное правило, которое я знаю, это нарушение - это инкапсуляция (которая предшествует DDD). Getters не обеспечивают инкапсуляцию (несмотря на сообщения об обратном). Все, что они делают, это позволить вам установить точки останова, которые трясут, когда кто-то получает. Они позволяют кому-либо получать информацию так же, как если бы поле было общедоступным.

Альтернативой иногда называют Скажите, не спрашивайте . Следуя этому правилу, вы перестанете запрашивать Payment для идентификатора терминала с помощью getTerminalId() и скажите «Платеж», что вы обрабатываете возврат с помощью payment.refund(). Вы должны пройти платеж, который он должен знать, чтобы выполнить оставшуюся часть этой работы, и вы можете доверять ему, чтобы сделать все остальное. Именно то, как это будет происходить, будет зависеть от того, какая реализация платежа это, но вам не нужно или хотите это знать. Это проблема другого.

Что, если информация, в которой вы нуждаетесь, разбросана? Отправьте команду через всю информацию, которая вам нужна, чтобы собрать ее, когда вы идете. Когда у вас достаточно, чтобы сделать что-то, сделайте это и сделайте с ним. Нет необходимости заставить обозревателя управлять этим. Это хорошо работает, когда вы делаете зависимости явными, поэтому вам не нужно угадывать, когда что-то находится в хорошем состоянии и готово к работе.

Я говорю, что все геттеры злы и неправы? Нет. Но я знаю, что проблемы, которые они вызывают, сначала тонкие. Легко просто жить с ним и начинать захватывать то, что вам нужно, как только вы его найдете. Но однажды вы захотите изменить ситуацию и найти не можете, потому что кажется, что все знают о том, что вы хотите изменить. Заманчиво пройти легкий путь. От него нелегко вернуться.

ответил candied_orange 27 +03002017-10-27T18:50:04+03:00312017bEurope/MoscowFri, 27 Oct 2017 18:50:04 +0300 2017, 18:50:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132