Интерфейс между контроллером и сервисным уровнем

1

Я новичок в.Net MVC, и мой вопрос сегодня касается шаблона MVC.

В нашем приложении у нас есть уровень обслуживания, который ведет переговоры с БД.

Контроллер в настоящее время разговаривает со слоем "Сервис", чтобы получить значения из БД.

Наш новый менеджер требует такого взаимодействия уровня сервиса от моделей, а не от контроллера.

Он говорит, что эта архитектура предназначена для создания тонкого контроллера. Теперь мы начинаем переносить взаимодействие уровня сервиса с контроллера на модели.

И вот мой вопрос. Помимо наличия тонкого контроллера, есть ли другие преимущества от применения этого шаблона.

Я хотел бы знать преимущества и недостатки обоих образцов.

Некоторые ссылки также будут полезны

Теги:
model-view-controller
asp.net-mvc
asp.net-mvc-3
service-layer

2 ответа

4
Лучший ответ

Почему вы не должны вызывать службы из ваших ViewModels:

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

Что такое модель просмотра

Если у вас возникли проблемы с пониманием того, что такое модель просмотра, а что нет, подумайте об этом как о подмножестве вашей модели. Он содержит только данные, которые необходимо отображать на данном изображении в данный момент времени.

2

Существует 3 типа моделей: модель, модель домена и модель данных. Проверьте здесь.

Если вы говорите о моделях, то это плохая идея. Существуют способы достижения тонкого контроллера, но ViewModel никогда не должен взаимодействовать с сервисами. Если его возможное действие Controller должно только вызвать службу и передать результат View. Как это:

[HttpGet]
public ActionResult GetAnimals(int id) 
{
    var viewModel = new AnimalsService(id).GetViewModel();
    return View(viewModel);
}

Но на самом деле много раз вы не можете сделать это по некоторым очевидным причинам. Однако есть несколько вещей, которые вы можете сделать. Например, не проверяйте модели в контроллере, вы можете сделать это на уровне обслуживания. Не стесняйтесь создавать больше сервисов для разных заданий, таких как разбиение на страницы, контекстная логика или вызов сторонних api. Создайте вспомогательные классы для повторяющихся кодов. Кроме того, я думаю, что нормально писать жирные услуги.

  • 0
    Также сервисные модели часто работают с моделью предметной области, это означает, что вам нужно как минимум отобразить модель предметной области для просмотра модели в контроллере. Я попытался перенести отображение в сервис, но, подумав, понял, что это плохая идея, поскольку сервисы говорят на своем языке (модель предметной области), поэтому не должны использовать виртуальную машину. Чтобы исправить ваши проблемы, вы можете создать фасад, как дополнительный слой непосредственно перед контроллером, если у кого-то все еще есть эта проблема в 2019 году :) Стоит ли это усилий? Если контроллер очень большой, я думаю, что да.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню