c# - 在 C# 中的 Model 类中处理 HttpClient 的最佳方法
问题描述
我有一个模型。它有一个名为 的属性country
。我需要通过 3rd 方服务验证此属性,即国家/地区是否有效
我可以考虑以下几种方式:
- 我应该在模型构造函数中注入 HttpClient 并在模型本身中调用第 3 方服务吗?
- 我是否应该创建另一个服务来调用第 3 方服务并将另一个服务注入我的模型中?
- 有没有更好的方法来做到这一点?
解决方案
您可以像任何其他可用的开箱即用验证器([Required]、[MaxLength]、[Range] 等)一样实现自定义模型验证。我将假设您正在使用某种类型的 ASP.net MVC 框架或 Core(ApiController、Controller 等)。如果您需要自定义验证,例如 MyModel.Country,您可以使用自定义验证器属性来装饰模型的“Country”属性。您应该避免在模型中使用诸如验证之类的业务逻辑代码,因为模型通常用于保存数据。
创建自定义验证器来验证 Country 属性。参考如何自定义模型验证。https://docs.microsoft.com/en-us/aspnet/core/mvc/models/validation?view=aspnetcore-2.2#custom-attributes
public ValidateCountryAttribute:ValidationAttribute{
protected override ValidationResult IsValid(object value, ValidationContext
validationContext)
{
string countryPropertyValue = (string)value;
//Validate your country
if (!ValidCountry(countryPropertyValue){
return new ValidationResult("Country is not valid");
}
//Return Validation.Success
return ValidationResult.Success;
}
private bool ValidCountry(string countryName){
//code to validate against 3rd party goes here.
return true;
}
}
在您的模型类上:
public class MyModel{
[ValidateCountry]
public string Country{get;set;}
}
当您在控制器的方法中收到 MyModel 时,您调用 ModelState.IsValid 来确定您收到的 MyModel 实例是否有效。
public class MyController:Controller{
public void Post(MyModel model){
if (!ModelState.IsValid){
//MyModel has invalid country, do something....
}
}
}
这样做的好处是,如果您需要国家/地区验证,现在可以将 ValidateCountryAttribute 放在任何模型类的属性上。这种方法可以更轻松地重用并将验证业务逻辑排除在模型之外。
推荐阅读
- python - Azure AD 与容器中运行的 Flask 集成的 PermissionError
- python - 布尔值总是返回为真?(熊猫)
- python - 在 NVIDIA Jetson TX2 上运行的 ultralytics yolov5 的非法指令(核心转储)
- javascript - 如何在“按Enter”jquery php上传递参数
- excel - Excel 文本连接:从重复的列值中提取单元格值
- python - Pytest如何对需要雪花连接的函数返回数据帧进行测试?
- clion - 在 clion 中使用编译数据库
- php - 烦人的重定向阻止我在本地主机上使用 WordPress 仪表板
- python - 将数据从一个 Kafka 主题移动到另一个主题在 Kafka Python 中不起作用
- jmeter - 在 JMeter 中保持负载是什么意思