有没有办法ModelStateDictionary
从 DI 访问(在控制器或 ActionFilter 之外)?我想我可以制作一个 ActionFilter 来存储对ModelStateDictionary
某处的引用,以便稍后在其他地方访问它,但我想知道是否有一种传统的方式来访问它,例如IHttpContextAccessor
for HttpContext
。
我们有一个 Web 应用程序,它是我们 api 的客户端。我想这样做的原因是因为我想ModelState
从DelegatingHandler
我们的 API 客户端(一个类型化的 http 客户端)使用的网络应用程序中自动添加错误。处理程序将监视来自 API 的每个响应,并且对于适用的响应(正文中带有自定义错误代码的 400 个响应,例如“名称已采用”),将消息添加到ModelState
.
到目前为止,我已经尝试过要求 a ControllerContext
,但它似乎总是为空。
var controllerContext = _serviceProvider.GetService<ControllerContext>();
controllerContext?.ModelState.AddModelError("", result.ErrorMessage);
我还使用 VS 调试器查看了所有注册的服务,但我找不到任何有希望的东西。
关于关于 SRP 和关注点分离的评论的旁注(相当大的一个):我不认为这违反了 SRP。API 客户端是我们 API 的通用客户端实现,可以在任何地方使用(我们目前在 Xamarin 和 ASP.NET Core MVC Web 应用程序上使用它 - 在这个问题中提到的那个)。但是,API 客户端HttpClient
在其构造函数中需要 a,这意味着它的行为可以被它的消费者修改。
例如,Web App 使用 DI 来提供HttpClient
API 客户端的需求。这HttpClient
是设置为使用两个委托处理程序,其中一个是我在这个问题中描述的那个。
至于是否ModelState
应该在控制器之外进行操作:嗯,这正是库之类的FluentValidation
(和 ASP.NET 默认验证)所做的。
至于是否ModelState
应该在 a 中操作DelegatingHandler
:我认为这是一个更有效的讨论。然而,没有人真正提出过为什么这是不好的论据。
至于这是否应该“自动”完成:我认为将代码放在一个地方比必须记住在每次调用 api 的每个动作中每次都这样做更好。
至于是否应该将这些消息放入ModelState
: 好吧,如果我在这里进入,这个旁注会变得太大。而且,没有人真正争论过这一点,所以......