Есть ли способ получить доступ к 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
: ну, если я углублюсь в это здесь, это боковое примечание станет слишком большим. Кроме того, никто особо не спорил по этому поводу, так что...