Я сделал несколько приложений MVC и нашел структуру, которая очень хорошо работает для меня. Он основан на серии MVC магазина Роба Конери , упомянутой JPrescottSanders (хотя ссылка, которую он разместил, неверна).
Итак, здесь я обычно пытаюсь ограничить свои контроллеры только логикой представления. Это включает в себя извлечение данных для передачи в представления и сопоставление данных, передаваемых из представления в модель предметной области. Ключ в том, чтобы попытаться не допустить бизнес-логики в этот слой.
Для этого я обычно получаю 3 слоя в своем приложении. Первый - это уровень представления - контроллеры. Вторым является уровень обслуживания - этот уровень отвечает за выполнение сложных запросов, а также за такие вещи, как проверка. Третий уровень - уровень хранилища - этот уровень отвечает за весь доступ к базе данных.
Итак, в вашем примере products это будет означать, что у вас будет ProductRepository с такими методами, как GetProducts () и SaveProduct (Product product). У вас также будет ProductService (который зависит от ProductRepository) с такими методами, как GetProductsForUser (пользователь-пользователь), GetProductsWithCategory (категория категории) и SaveProduct (продукт-продукт). Такие вещи, как проверка также будет происходить здесь. Наконец, ваш контроллер будет зависеть от уровня обслуживания для получения и хранения продуктов.
Вы можете обойтись без пропуска сервисного уровня, но обычно вы обнаружите, что ваши контроллеры очень толстые и имеют тенденцию делать слишком много. Я пробовал эту архитектуру довольно много раз, и она работает довольно хорошо, тем более что она очень хорошо поддерживает TDD и автоматизированное тестирование.