Должен ли контроллер когда-либо понадобиться напрямую обращаться к репозиторию, или он должен всегда запускаться через уровень обслуживания? Или есть другие варианты?
ASP.NET MVC - репозиторий/служба/контроллер
Ответ 1
Если у вас есть сервисный уровень, и вы используете его таким образом, чтобы абстрагировать бизнес-логику от хранилища (как и на уровне сервиса), тогда нет, ваши контроллеры должны делать только вызовы методам службы, Тогда сервисный уровень будет соединением с репо.
В дополнение к Mayo ответ: модель - это классы данных, которые будут передаваться по всему приложению (репо, служба и пользовательский интерфейс/контроллеры), чтобы пользовательский интерфейс/веб-слой "работал" с ними так же, как и другие слои.
Я думаю, что если вы реализуете сервисный уровень в контексте определение Fowler и современный aspnet mvc адаптация, тогда вы должны иметь действия с вашим контроллером, разработанные как очень маленькие и легкие методы, вызывающие "мясистые" бизнес-логика" с вашего уровня обслуживания.
РЕДАКТИРОВАТЬ: Я думаю, я не был ясен: я не говорю, что имеет сервисный уровень - единственный вариант, просто пытающийся ответить на часть вопроса в случае, если вы сделаете, используйте сервисный уровень. Согласованный уровень обслуживания не всегда необходим, особенно для небольших проектов.
Ответ 2
Вам не всегда нужен сервисный уровень - в простых ситуациях он просто над инженерным решением. Это нормально для контроллера для вызова репозитория. Но, если вы видите, что ваши контроллеры вздуваются с логикой или вы повторяетесь в действиях контроллера, посмотрите на установку службы между контроллером и репозиторием и переместите некоторую логику с контроллера на сервисный уровень.
Ответ 3
Я согласен с @Sosh об инженерной точке. Но я нашел одно большое преимущество от того, что контроллер прошел через службу, когда пришло время повторно использовать эту услугу через провод через SOAP/REST, ваша работа по рефактору очень минимальна. Имейте в виду, что это нарушает YAGNI, и он думает заранее (в некоторой степени).
Но опять же - после прочтения последней книги Джеффри Палермо - MVC In Action, у него есть контроллер с нулевым логическим разговором с репозиторий напрямую, и он работает нормально.
Ответ 4
Все примеры, с которыми я работал, похоже, предполагают, что контроллер должен работать с моделью.
Тем не менее, я слышал, что некоторые авторы полагают, что модель состоит из всего: от бизнес-логики до хранилища данных (в отличие от классов бизнес-объектов, которые многие считают моделью).
Лично я постараюсь сохранить его чистым/последовательным, если контроллер работает с классами, которые работают против репозитория, но я не думаю, что против него существует жесткое/быстрое правило.
Ответ 5
Уровень сервиса - это, в основном, api для вашей бизнес-логики/бизнес-модели. Например, у вас может быть какой-то метод, который получает ваш "лучший клиент". Затем сервисный уровень делает то, что ему нужно сделать, чтобы запросить репозиторий, выполнить любую логику, необходимую ему и т.д., И вернуть клиента. В таких случаях вы всегда должны пройти через сервисный уровень.
Иногда, хотя вы просто извлекаете объект, который может быть в вашей модели просмотра, но не в бизнес-модели. Конечно, вы могли бы добавить обертку вокруг репозитория на уровне сервиса, но тогда вы рискуете запутать свой уровень обслуживания и заполнить его бессмысленными вещами. В таких случаях я не вижу вреда в том, чтобы идти прямо в репозиторий.
Ответ 6
Контроллер интерпретирует ввод пользователя и подготавливает модели для использования View, поскольку я понял это. Некоторые люди очень серьезно относятся к тому, чтобы удалять каждый бит логики с моделей, но я не настолько анал об этом.
Лучшим вариантом IMHO является использование DI для доступа к вашему репозиторию из контроллера.