Есть ли способ доступа к ModelStateDictionary
из DI (вне контроллера или ActionFilter)? Я думаю, что могу создать ActionFilter, который хранит ссылку на ModelStateDictionary
где-то, так что я могу получить к нему доступ позже, но я хочу знать, есть ли обычный способ доступа к нему, как например IHttpContextAccessor
за HttpContext
.
У нас есть веб-приложение, которое является клиентом для нашего API. Причина, по которой я хочу это сделать, заключается в том, что я хочу автоматически добавлять ошибки в ModelState
веб-приложения из DelegatingHandler
, используемого нашим клиентом API (типизированным http-клиентом). Обработчик следит за каждым ответом от API и, для применимых (400 ответов с пользовательскими кодами ошибок в теле, например, «Имя уже занято»), добавляет сообщение в ModelState
.
До сих пор я пытался попросить ControllerContext
, но, похоже, он всегда нулевой.
var controllerContext = _serviceProvider.GetService<ControllerContext>();
controllerContext?.ModelState.AddModelError("", result.ErrorMessage);
Я также просмотрел все зарегистрированные сервисы, использующие отладчик VS, но не смог найти ничего обещающего.
Дополнительное примечание (довольно большое), касающееся комментариев о SRP и разделении интересов: я не думаю, что это нарушает SRP. Клиент API - это общая клиентская реализация нашего API, которую можно использовать из любого места (в настоящее время мы используем его в Xamarin и веб-приложении ASP.NET Core MVC - о котором упоминается в этом самом вопросе). Однако клиент API ожидает HttpClient
в своем конструкторе, что означает, что его поведение может быть изменено его потребителями.
Например, в веб-приложении используется DI для HttpClient
, необходимого клиенту API. HttpClient
настроен на использование двух делегирующих обработчиков, один из которых я описал в этом вопросе.
Относительно того, следует ли манипулировать ModelState
вне контроллеров: ну, это именно то, что делают библиотеки, такие как FluentValidation
(и проверка по умолчанию в ASP.NET).
Относительно того, следует ли манипулировать ModelState
в DelegatingHandler
: я думаю, что это несколько более обоснованное обсуждение. Однако на самом деле никто не представил никаких аргументов в пользу того, почему это плохо.
Что касается или нет, это должно быть сделано "автоматически": я думаю, что лучше иметь код в одном месте, чем не забывать делать это каждый раз при каждом действии при каждом вызове API.
Относительно того, должны ли эти сообщения быть даже помещены в ModelState
: хорошо, если я зайду сюда, эта сторона станет слишком большой. Кроме того, никто действительно не спорил об этом, так что ...