О правильной реализации сложных уровней обслуживания - PullRequest
2 голосов
/ 26 января 2012

У меня следующая ситуация:

Три конкретных класса обслуживания реализуют интерфейс службы: один - для сохранения, другой - для уведомлений, третий - для добавления точек к конкретным действиям (геймификации). Интерфейс имеет примерно следующую структуру:

public interface IPhotoService {
   void upload();
   Photo get(Long id);
   void like(Long id);
   //etc...
}

Я не хотел смешивать три типа логики в одном сервисе (или, что еще хуже, в классе контроллера), потому что я хочу иметь возможность изменить их (или закрыть их) без каких-либо проблем. Проблема возникает, когда мне приходится вводить конкретную службу в контроллер для использования. Обычно я создаю четвертый класс с именем примерно ApplicationNamePhotoService, который реализует тот же интерфейс и работает как оболочка (посредник) между остальными тремя службами, которая получает входные данные от контроллера и соответственно вызывает каждую службу. Хотя это и рабочий подход, который создает много стандартного кода.

Это правильный подход? В настоящее время я не знаю о лучшем, хотя я буду очень признателен за то, чтобы узнать, можно ли декларативно (в контексте) объявить последовательность выполнения и добавить в контроллер экземпляр обертки, созданный на лету.

Кроме того, было бы неплохо кэшировать некоторые вещи между тремя сервисами. Например, все используют DAO, то есть иногда делают одни и те же вызовы БД снова и снова. Если бы вся логика была в одном месте, чего можно было бы избежать, но сейчас ... Я знаю, что возможно включить некоторое кэширование на основе запросов или сеансов. Можете ли вы предложить мне пример кода? Кстати, я использую Hibernate для персистентной части. Уже предусмотрено какое-то кэширование (возможно, если они находятся в одной транзакции или чем-то еще - с этой я полностью потерялся)

1 Ответ

1 голос
/ 26 января 2012

Сервисный уровень должен состоять из классов с методами, которые являются единицами работы с действиями, которые принадлежат одной и той же транзакции. Похоже, вы смешиваете классы обслуживания, когда они могут быть в одном классе и методе. При необходимости вы также можете внедрять классы обслуживания друг в друга, а не создавать другого «посредника».

Вполне приемлемо "смешать три типа логики", фактически предпочтительнее, если они образуют ожидаемый вариант использования / единицу работы

Кеширование Я бы хотел использовать ах кеш , который, как мне кажется, хорошо интегрирован с hibernate.

...