В MVC DAO должен вызываться из контроллера или модели

14

Я видел различные аргументы против прямого вызова DAO из класса Controller, а также DAO из класса Model. Фактически я лично чувствую, что если мы следуем шаблону MVC, контроллер должен быть связан не с DAO, а с классом Model. должен вызывать DAO изнутри, а контроллер должен вызывать класс модели. Почему мы можем отделить класс модели от веб-приложения и предоставить различные функции, например, для службы REST, чтобы использовать наш класс модели.

Если мы запишем вызов DAO в контроллере, для службы REST не будет возможности повторно использовать функциональность, верно? Я суммировал оба подхода ниже.

Подход № 1

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            new CustomerDAO().save(customer);

    }


 }

Подход № 2

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            customer.save(customer);

    }


 }

 public class Customer {

   ...........

   private void save(Customer customer){

        new CustomerDAO().save(customer);

   }

}

Примечание -

Вот что такое определение модели:

Модель: модель управляет поведением и данными домена приложения, отвечает на запросы информации о его состоянии (обычно из представления) и отвечает на инструкции по изменению состояния (обычно от контроллера).

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

Мне нужно мнение эксперта по этому вопросу, потому что я нахожу, что многие используют №1 или №2. Так что же это?


источник
Контроллер должен загрузить все из модели и передать его в представление.
JGauffin
Вы предлагаете подход № 2?
1
«Контроллер может отправлять команды в свой связанный вид для изменения представления модели (например, путем прокрутки документа). Он может отправлять команды в модель для обновления состояния модели (например, редактирование документа)». .. эмм ... где говорится, что контроллер должен извлекать данные или передавать их?
Мефисто

Ответы:

31

На мой взгляд, вы должны различать шаблон MVC и 3-уровневую архитектуру. Подводить итоги:

3-х уровневая архитектура:

  • данные: постоянные данные;
  • сервис: логическая часть приложения;
  • презентация: hmi, веб-сервис ...

Шаблон MVC имеет место на уровне представления вышеупомянутой архитектуры (для веб-приложения):

  • данные: ...;
  • служба: ...;
  • презентация:
    • контроллер: перехватывает запрос HTTP и возвращает ответ HTTP;
    • модель: хранит данные для отображения / обработки;
    • view: организует вывод / отображение.

Жизненный цикл типичного HTTP-запроса:

  1. Пользователь отправляет HTTP-запрос;
  2. Контроллер перехватывает это;
  3. Контроллер вызывает соответствующую услугу;
  4. Служба вызывает соответствующий dao, который возвращает некоторые постоянные данные (например);
  5. Служба обрабатывает данные и возвращает данные в контроллер;
  6. Контроллер сохраняет данные в соответствующей модели и вызывает соответствующее представление;
  7. Представление создается с данными модели и возвращается как ответ HTTP.
sp00m
источник
То, что вы называете «жизненным циклом типичного HTTP-запроса» , не является MVC. А DAO - это просто объект, который облегчает взаимодействие / перевод между доменной логикой и постоянством. Это НЕ другое имя для активной записи. Также .. с каких пор модель стала частью презентации ?!
Мефисто
1
@teresko 1) Да, это MVC, но в рамках 3-уровневой архитектуры. Если нет, то почему? 2) Ты был прав, я отредактировал. 3) Поскольку весь шаблон MVC имеет место на уровне представления. Типичный пример: Spring MVC, моделями которого являются только Карты, содержащие пары ключ-значение. SpringFuse сделал этот выбор тоже.
sp00m
2
Я должен согласиться с @ sp00m здесь ... Его описание типичного HTTP-запроса является точным для веб-приложения MVC, и его позиционирование модели (как «M» в MVC) как части уровня представления также является правильным , В n-уровневых приложениях MVC «Модель», как правило, является фасадом уровня представления по сравнению с остальными уровнями ниже.
Эрик Кинг,
8

С модельного слоя.

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

Контроллер должен отвечать только за изменение состояния уровня модели. DAOs являются частью постоянного механизма. Это составляет часть бизнес-логики и прикладной логики. Если вы начнете взаимодействовать с DAO в контроллере, у вас будет утечка логики домена на уровне представления .

Mefisto
источник
Чтобы использовать сервисный уровень, это должен быть шаблон DDD? поправьте меня если я ошибаюсь. У нас есть сервисный уровень в MVC?
Вы можете иметь. Службы используются для отделения логики домена от логики приложения. Это становится необходимым, затем вы переходите от чисто доменных структур CRUD (активная запись) к чему-то, что отделяет логику хранилища от логики домена. В полностью реализованном уровне модели у вас есть 3 логических разделения: постоянство, домен и приложение.
Мефисто
3

Я не уверен, к чему призывает официальный шаблон MVC, но обычно мне нравится иметь «служебный» слой между контроллерами и DAO. Контроллер извлекает данные из запроса и передает их в соответствующий класс обслуживания. Класс обслуживания отвечает за вызов одного или нескольких DAO, которые возвращают класс (ы) модели. Эти классы моделей затем отправляются обратно в контроллер для отправки на уровень представления. Помещение уровня обслуживания помогает с повторным использованием, поскольку несколько контроллеров могут использовать одни и те же методы уровня обслуживания.

Шейн
источник