首页 > 解决方案 > 在 C# 中的 Model 类中处理 HttpClient 的最佳方法

问题描述

我有一个模型。它有一个名为 的属性country。我需要通过 3rd 方服务验证此属性,即国家/地区是否有效

我可以考虑以下几种方式:

  1. 我应该在模型构造函数中注入 HttpClient 并在模型本身中调用第 3 方服务吗?
  2. 我是否应该创建另一个服务来调用第 3 方服务并将另一个服务注入我的模型中?
  3. 有没有更好的方法来做到这一点?

标签: c#.netvalidationasp.net-core.net-core

解决方案


您可以像任何其他可用的开箱即用验证器([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 放在任何模型类的属性上。这种方法可以更轻松地重用并将验证业务逻辑排除在模型之外。


推荐阅读