Есть прямые ответы на ваши вопросы.Поэтому я поставил ответы без фона.
На каком уровне в основном должны проводиться проверки?
Как на стороне сервера, так и на стороне клиента для более точных и безопасных приложений.Независимо от контекста дизайна.На стороне сервера вы можете использовать различные способы, такие как свободная проверка или аннотация данных (модель), или предоставить их клиенту с помощью библиотек интеграции, таких как jquery-unobtrusive-ajax. Проверка на стороне сервера более важна , так как операции CRUD должны быть проверены, чтобы избежать аномалий и т. Д. .... С точки зрения вашего вопроса, слоями являются Вид и Модель (Доступ к данным).
Допустимо ли, чтобы объект находился в недопустимом состоянии?потому что во многих ответах говорилось, что все в порядке, и в основном из-за исторических данных и бизнес-правил могут со временем меняться, а загрузка исторических данных может вызвать проблемы?
Это допустимо, обязательные поля или пустые значения для требуемых зависимостей запускаютсяошибка при показе или обработке хранилища данных в базе данных.Здесь не говорится об изменениях, которые могут быть со временем.Мы рассмотрим только сейчас.Мы используем шаблоны и правила программирования для создания гибкости / удобства обслуживания.Проверки и входные зависимости могут изменяться со временем.
Многие реализации рассматривают выбрасывание исключений на уровне домена и сопоставление сообщений с пользовательским интерфейсом, хотя Мартин Фаулер рекомендует заменять выбрасывающие исключения на уведомления в валидациях!Когда возвращать сообщения, а когда выбрасывать исключения в контексте проверки?
Отображение исключения на стороне клиента - это хороший метод для дней разработки или для уведомления соответствующего пользователя об ошибке, которая препятствует изменению данных /сохраняются., учитывая, что : некоторые системы действительно не имеют никакой стратегии, чтобы показать дополнительную информацию конечному пользователю.Некоторые отчеты могут сделать приложение более уязвимым для вторжения.Это полностью зависит от типа программного обеспечения, которое вы разрабатываете.Хорошей практикой является показ простой ошибки на стороне клиента и хранение журналов ошибок внутри сервера (с подробными сведениями).
Во многих статьях объясняются некоторые советы или пути, которым следует следовать, как Владимир Хориков и jbogard в своих статьях.но в комментариях они признаются, что теперь делают все по-другому.Эти шаблоны все еще действительны?
У некоторых людей могут быть личные архитектуры с собственными именами.Но некоторые из них являются официальными и широко используются, например, Unit Of Work или Repository Pattern , которые добавляют несколько слоев к известному шаблону (MVC) для достижения более точного, чистого и поддерживаемого кода / приложения.Следуйте основной цели любого шаблона.
Должен ли я использовать фреймворк, такой как FluentValidation, и, если я его использую, эта фреймовая работа используется только на прикладном уровне в качестве альтернативы аннотациям MVC?Когда я должен вместо этого использовать Business Rule Framework (BRF)?
FluentValidation является альтернативой DataAnnotations , работающей как FluentAPI .Обратите внимание, что оба используются для определения правил для свойств, принадлежащих определенному классу (таблица базы данных).Существует концепция с именем ViewModel , которая содержит преобразование (с некоторыми изменениями) для класса Main Model (таблица), в основном предназначенное для проверки в front-end.Вы можете использовать оба для проекта, сопоставляя каждую модель с ее ViewModel или наоборот.Если вы используете шаблон репозитория, скажем, у вас есть уровень доступа к данным, поэтому некоторая часть проверки находится внутри этого уровня.Если вы используете ViewModel, значит, он находится внутри уровня приложения.Но, как совет, они бесполезны.Ключевой успех состоит в том, чтобы понять основную цель любой техники / архитектуры / шаблона.Вы можете найти тонны статей вокруг каждого из них и сосредоточиться на цели, а затем решить, что делать, чтобы получить более чистый / стандартный / поддерживаемый / гибкий / и т. Д. Код.
И Заключительный совет : Увеличение модульности увеличивает стоимость интеграции (стоимость программного обеспечения), хотя снижает стоимость каждого модуля.Используйте умеренный дизайн для вашего проекта.Объединение архитектур иногда не только не является хорошей идеей, но также увеличивает стоимость и трудности разработки.Подробнее в Основы проектирования программного обеспечения