Ключевой концепцией доменного дизайна является создание богатого дизайна, который передает и отражает жаргон своих доменных экспертов (бизнес-пользователей). Затем вы хотите, чтобы ваш код стал выражением этой доменной модели. (см. «Повсеместный язык» и «Дизайн на основе моделей» в сводках DDD Patterns ).
Когда вы сделаете это, вы создадите имена для ваших сущностей (классов), которые отражают, как их может описать бизнес-пользователь. Кроме того, вы затем создадите методы для этих классов, которые также отражают домен.
Имея это в виду, может быть полезно рассмотреть, как вы относитесь к своим "вспомогательным" или "служебным" классам. Используя некоторые из ваших описаний, у вас могут быть классы и методы, такие как:
product = GetProduct(data.productId);
shoppingCart.add(product);
receipt = customer.Purchase(shoppingCart);
Ваш метод Customer.Purchase может выполнять следующие действия:
creditCard = this.getCreditCart(creditCardNumber);
purchaseNumber = creditCard.Charge(shoppingCart.Total);
Я понимаю, что эти примеры не являются полными или даже полностью точными, но я надеюсь, что идея полезна.
В ответ на ваш первоначальный вопрос - да, все в порядке, чтобы иметь вспомогательные классы поддержки. Однако вы хотите создать эти классы поддержки и сопоставить их с реальными объектами домена. Поработав со своими пользователями, вы, вероятно, сможете создавать значимые доменные объекты, которые представляют собой нечто большее, чем объекты сценария транзакции.
Надеюсь, это поможет. Удачи!