Зачем скрывать DAO за сервисом? - PullRequest
3 голосов
/ 07 мая 2009

Рассматривая множество веб-приложений в стиле MVC, я замечаю, что очень часто очень большой сервисный интерфейс находится перед бизнес-уровнем. Реализация этого интерфейса обычно включает в себя несколько DAO. Итак, у вас есть что-то вроде:

public class FoodServiceImpl implements FoodService {

  private FruitDAO fruitDAO;
  private VegetableDAO vegetableDAO;
  private MeatDAO meatDAO;

  // ... DAO injection stuff

  public List<Meat> getMeat() {
    return meatDAO.getMeat();
  }

  public void addMeat(Meat meat) {
    meatDAO.add(meat);  
  }

  public List<Fruit> getFruit() {
    return fruitDAO.getFruit();
  }

  // ... tons of methods that mostly just delegate to DAOs

}

Если предположить, что ваши DAO изначально не конкретны, почему бы просто не открыть DAO на следующий уровень?

Так что вместо:

// assume foodService is injected at runtime
public void controllerMethod() {
  foodService.getFruit();
  foodService.getMeat();
}

У вас просто есть

// assume DAOs are injected at runtime
public void controllerMethod() {
  fruitDAO.getFruit();
  meatDAO.getMeat();
}

С одной стороны, выглядит неплохо, чтобы все функции приложения были объединены в одном интерфейсе ... с другой стороны, вы можете получить гигантский интерфейс, реализация которого не более чем делегирует DAO .

Я вижу, что приятно управлять всеми DAO в одном месте. Я также могу себе представить, что этот шаблон будет полезен, если одни и те же DAO будут использоваться через несколько служб.

Считается ли это "наилучшей практикой" при запуске веб-приложения или применяется только тогда, когда ожидается определенный уровень и тип сложности?

Ответы [ 5 ]

8 голосов
/ 07 мая 2009

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

Кроме того, это сущность сервис-ориентированной архитектуры. Забудьте о WS- *; карта услуг для использования вариантов и бизнес-процессов.

6 голосов
/ 07 мая 2009

Если предположить, что весь бэкэнд - это не один гигантский CRUD API, вы часто будете видеть бизнес-логику, вызываемую на уровне обслуживания. Бизнес-логика может быть непосредственно в самих методах службы (a.k.a. «Анемичная модель предметной области»), или уровень службы должен просто отвечать за вызов бизнес-методов для объектов, передаваемых на уровень DAO и обратно («Обширная модель предметной области»). Вы также можете увидеть такие вещи, как безопасность или аудит и другие операции, выполняемые на уровне обслуживания. В качестве альтернативы сквозные аспекты, такие как безопасность или аудит, могут быть применены к уровню обслуживания с помощью Аспектно-ориентированного программирования (AOP).

3 голосов
/ 07 мая 2009

Существует только одна причина создания класса: скрыть некоторые детали реализации и т. Д. За фиксированной границей. В этом примере у вас есть служба под названием FoodService и класс реализации, который знает о различных DAO. Так что ты прячешь?

Это выглядит как две вещи:

  1. тот факт, что у вас есть такие виды продуктов
  2. как они хранятся.

Если способ их хранения никогда не изменится, то вам это может не понадобиться. Но если ваши DAO когда-либо будут заменены другим механизмом, скажем, распределенным Google BigTable, вы можете предпочесть не трогать весь код, меняющий типы.

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

2 голосов
/ 07 мая 2009

MVC - это в основном шаблон представления, в большинстве нетривиальных систем используется многоуровневый подход, когда, по крайней мере, у вас есть уровень представления, бизнес-уровень и уровень доступа к данным. В вашем случае вы МОЖЕТЕ непосредственно представлять DAO, но поддержание бизнес-уровня в центре служит для лучшей инкапсуляции бизнес-логики и способствует расширяемости системы. Предположим, у вас есть новое требование о том, где хранить мясо:

if (meat.expirationDate-today >= 5 days)
   FridgeDAO.store(meat)
else if (meat.expirationDate-today <5 days)
   FreezerDAO.store(meat)
else 
   discard(meat)

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

0 голосов
/ 05 августа 2010

Лучший способ сделать удаленное взаимодействие - это вообще не делать удаленное взаимодействие.

Выполнение кода в слоях - это хорошо, но вам не нужно форсировать слои, создавая API удаленного взаимодействия. Любой, кто делает это без какой-либо реальной потребности в архитектуре (например, анализ производительности и т. Д.), Просто бросает модные слова или создает потребность там, где ее нет.

Помните, что время программиста стоит дороже, чем аппаратное обеспечение в целом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...