- Как избежать проблемы «переноса зависимости»?
Хороший объектно-ориентированный дизайн BaseController SuperClass может справиться с большим количеством тяжелой работы по созданию экземпляров часто используемых объектов и т. Д. Использование составных типов для обмена данными между вызовами является весьма распространенной практикой. Например. Создание некоторого объекта контекста, уникального для вашего приложения, в контроллере для обмена информацией между процессами - не страшная идея.
- Какие данные вы храните в сеансе?
Столько всего, что возможно по-человечески.
Если есть какая-то интенсивная операция с данными, требующая много обработки для обработки, и это требуется довольно часто приложением, это подходящий кандидат для хранения сеанса. И да, хранение информации, такой как идентификатор пользователя и другая информация персонализации, не является плохой практикой для состояния сеанса. Как правило, использование файлов cookie является предпочтительным способом персонализации. Всегда помните, что никогда, никогда не доверяйте содержимому файлов cookie, например, перед тем, как доверять этому, проверьте правильность прочитанного.
- Размещаете ли вы методы извлечения данных в самой модели или в отдельном объекте, который получает данные и возвращает модель?
Я предпочитаю использовать шаблон Repository для своих моделей. Сама модель обычно содержит простые проверки бизнес-правил и т. Д., В то время как репозиторий обращается к бизнес-объекту для результатов и преобразований / манипуляций. На рынке существует множество паттернов и инструментов ORM, и эта тема обсуждается очень часто, поэтому иногда приходится просто знакомиться с инструментами и т. Д. *
- В чем преимущества этого подхода?
Преимущество, которое я вижу с шаблоном репозитория, состоит в том, что чем тупее ваши модели, тем легче их модифицировать. Если они являются представителями бизнес-объекта (например, веб-службы или таблицы данных), изменения в этих базовых объектах достаточно абстрагированы от логики представления, которая является моим MVC-приложением. Если я реализую всю логику загрузки модели в самой модели, я как бы нарушаю шаблон разделения интересов. Опять же, это все очень субъективно.
- Если ваш сайт управляется идентификатором пользователя, как вы проводите модульное тестирование своей кодовой базы?
Настоятельно рекомендуется использовать Dependency Injection, когда это возможно, в коде. Некоторые контейнеры IoC позаботились об этом достаточно эффективно и, поняв это, значительно улучшат вашу общую архитектуру и дизайн. При этом сам пользовательский контекст должен быть реализован через некоторую форму известного интерфейса, который затем может быть «смоделирован» в вашем приложении. Затем в своем тестовом комплекте вы можете смоделировать любого пользователя, которого хотите, и все зависимые объекты не будут знать разницы, потому что они будут просто смотреть на интерфейс.
- Вообще говоря, вы тестируете свои контроллеры?
Абсолютно. Поскольку ожидается, что контроллеры будут возвращать известные типы контента, с надлежащими инструментами тестирования мы можем использовать методы, чтобы высмеивать информацию HttpContext, вызывать метод действия и просматривать результаты, чтобы убедиться, что они соответствуют нашим ожиданиям. Иногда это приводит к поиску только кодов состояния HTTP, когда результатом является какой-то массивный HTML-документ, но в случае ответа JSON мы можем легко увидеть, что метод действия возвращает всю информацию сценария, как и ожидалось
- Что именно вы тестируете в своих контроллерах?
Любые и все публично объявленные члены вашего контроллера должны быть тщательно протестированы.
Длинный вопрос, более длинный ответ. Надеюсь, что это кому-нибудь поможет, и, пожалуйста, просто примите это как мое собственное мнение. Многие из этих вопросов - религиозные дебаты, и вы всегда в безопасности, просто практикуя надлежащий объектно-ориентированный дизайн, SOLID, программирование интерфейса, DRY и т. Д. *