Итак, я заметил, что определенно имею тенденцию моделировать мои объекты стека Spring/Hibernate следующим образом:
- Контроллер Foo вызывает вызов "FooService"
- FooService вызывает метод FooRepository.getById(), чтобы получить Foos.
- FooRepository делает некоторые вызовы Hibernate для загрузки объектов Foo.
- FooService выполняет некоторые взаимодействия с Foos. Он может использовать связанный TransactionalFooService для обработки вещей, которые необходимо выполнить вместе в транзакции.
- FooService просит FooRepository сохранить Foos.
Проблема здесь в том, что у Foos нет реальной логики. Например, если электронное письмо должно отправляться каждый раз, когда истекает срок действия Foo, нет вызова Foo.expire(). Там вызывается FooService.expireFoo(fooId). Это происходит по разным причинам:
- Досадно обращаться к другим сервисам и объектам из Foo. Это не Spring bean, и он был загружен Hibernate.
- Это раздражает, чтобы заставить Foo сделать несколько транзакций транзакционно.
- Трудно решить, должен ли Foo отвечать за выбор, когда нужно сохранить себя. Если вы вызываете foo.setName(), следует ли продолжить сохранение? Должна ли она ждать, пока вы не назовете foo.save()? Должен ли foo.save() просто вызывать FooRepository.save(это)?
Таким образом, по этим причинам мои объекты домена Spring имеют тенденцию быть в основном прославленными структурами с некоторой логикой проверки. Может быть, все в порядке. Возможно, веб-службы в порядке как процедурный код. Возможно, когда новые функции будут написаны, приемлемо создавать новые службы, которые обрабатывают одни и те же старые объекты по-новому.
Но я бы хотел сбежать от такого дизайна, и мне интересно, что с ним делают другие Spring? Вы сражаетесь с ним с помощью причудливых трюков, таких как ткачество с загрузкой (что мне не так удобно)? У вас есть другой трюк? Считаете ли вы, что процедурный вопрос в порядке?