Изменить: это не конфликт на теоретическом уровне, а конфликт на уровне реализации.
Другое Редактирование: Проблема заключается не в том, что модели домена являются данными только -DTOs по сравнению с более богатой, более сложной картографией объекта, где Order имеет OrderItems и некоторую вычисляющую полную логику. Конкретная проблема заключается, например, в том, что, например, заказ должен получить последние оптовые цены OrderItem с некоторых веб-сервисов в Китае (например). Таким образом, у вас есть сервис Spring, который позволяет звонить на эту услугу PriceQuery в Китае. Заказ рассчиталTotal, который выполняет итерацию по каждому OrderItem, получает самую последнюю цену и добавляет ее к общей сумме.
Итак, как бы вы гарантировали, что каждый заказ имеет ссылку на эту услугу PriceQuery? Как вы можете восстановить его при де-сериализации, загрузке из БД и новых экземплярах? Это мой точный вопрос.
Простым способом было бы передать ссылку на метод calculateTotal, но что, если ваш объект использует эту услугу на протяжении всей своей жизни? Что, если он используется в 10 методах? Каждый раз становится бесполезным, чтобы передавать ссылки.
Другим способом было бы перевести вычислениеОбратно из Ордера и в OrderService, но это нарушает OO-дизайн, и мы движемся к старому способу "Транзакции Script".
Оригинальное сообщение:
Краткая версия: Богатые объекты домена требуют ссылок на многие компоненты, но эти объекты сохраняются или сериализуются, поэтому любые ссылки, которые они хранят на внешние компоненты (Spring beans в этом случае: службы, репозитории, что-либо), являются временными и уничтожаются. Они должны быть повторно инъецированы, когда объект де-сериализуется или загружается из БД, но это очень уродливо, и я не вижу элегантный способ сделать это.
Более длинная версия: Некоторое время я занимался свободной связью и DI с помощью Spring. Это очень помогло мне в управлении и проверке. Некоторое время назад, тем не менее, я читал проект, управляемый доменами, и некоторый Мартин Фаулер. В результате я пытался конвертировать мои модели домена из простых DTO (обычно простых представлений строки таблицы, а только без логических данных) в более богатую модель домена.
Поскольку мой домен растет и берет на себя новые обязанности, мои объекты домена начинают требовать некоторые из beans (сервисы, репозитории, компоненты), которые у меня есть в моем контексте Spring. Это быстро стало кошмаром и одной из самых сложных частей преобразования в богатый дизайн домена.
В основном есть точки, где я вручную вводя ссылку на контекст приложения в свой домен:
- когда объект загружается из репозитория или другого ответственного объекта, поскольку ссылки на компоненты являются временными и, очевидно, не сохраняются.
- когда объект создается из Factory, поскольку вновь созданный объект не имеет ссылок на компоненты
- когда объект де-сериализуется в задании Quartz или в каком-либо другом месте, так как ссылки на переходные компоненты становятся протертыми
Во-первых, это уродливо, потому что я передаю объект ссылку на контекст приложения и ожидаю, что он вытащит ссылки на ссылки на нужные ему компоненты. Это не инъекция, а прямая тяга.
Во-вторых, это уродливый код, потому что во всех упомянутых местах мне нужна логика для инъекции appContext
В-третьих, он подвержен ошибкам, потому что я должен помнить, чтобы вводить во все эти места для всех этих объектов, что сложнее, чем кажется.
Там должен быть лучший способ, и я надеюсь, что вы можете пролить свет на него.