Я думаю, что существует простой шаблон рефакторинга, который решит вашу проблему.
- Добавьте ваш сервис в ваш репозиторий.
- Перед возвратом Foo установите его 'FooService
- Теперь попросите ваш FooController запросить соответствующий Foo из FooRepository
- Теперь назовите методы, которые вы хотите на вас Foo. Если он не может реализовать их сам, попросите его вызвать соответствующий метод на FooService.
- Теперь удалите все вызовы FooService через то, что мне нравится называть методами "моста моста" в Foo (он просто передает параметры службе).
- Теперь, когда вы хотите добавить метод, добавьте его в Foo.
- Добавляйте материал в сервис только тогда, когда вам действительно нужно по соображениям производительности. Как всегда, эти методы должны вызываться через объект модели.
Это поможет развить вас к более богатой доменной модели. Он также сохраняет принцип единой ответственности, поскольку весь ваш DB-зависимый код остается в имплементациях FooService и помогает вам перенести бизнес-логику с FooService на Foo. Если вы хотите переключить свой сервер на другую БД или в оперативную память или макет (для тестирования), вам не нужно ничего менять, кроме уровня FooService.
^ Я предполагаю, что FooService выполняет вызовы БД, которые будут слишком медленными для ORM, например, выбор самого последнего Foo, который разделяет свойство X с данным Foo. Вот как больше всего я видел работу.
* +1025 * Пример
Вместо:
class Controller{
public Response getBestStudentForSchool( Request req ){
Student bestStudent = StudentService.findBestPupilForSchool( req.getParam( "schlId" ).asInt() );
...
}
}
Вы будете двигаться к чему-то вроде этого:
class Controller{
public Response getBestStudentForSchool( Request req ){
School school = repo.get( School.class, req.getParam( "schlId" ).asInt() );
Student bestStudent = school.getBestStudent();
...
}
}
Что, я надеюсь, вы согласитесь, уже кажется богаче. Теперь вы делаете еще один вызов базы данных, но если вы продолжите кэшировать школу в сеансе, штраф будет незначительным. Я боюсь, что любая действительно ООП-модель будет менее эффективной, чем используемая вами анемичная модель, но уменьшение ошибок за счет ясности кода должно стоить того. Как всегда, YMMV.