如何为C#开发的小型REST Api Client服务编写对应接口
C# REST API Client 接口封装实现方案
1. 定义服务抽象接口
首先将需要对外暴露的方法抽象为接口契约,后续所有业务调用都依赖接口而非具体实现类:
public interface ICompanyService { // 现有GET方法契约 Task<ICollection<CompanyModel>> GetCompanies(); // 后续可按需扩展其他HTTP方法的契约 // Task<CompanyModel> GetCompanyById(Guid companyId); // Task<CompanyModel> CreateCompany(CompanyCreateDto createDto); // Task UpdateCompany(Guid companyId, CompanyUpdateDto updateDto); // Task DeleteCompany(Guid companyId); }
2. 调整现有服务类实现接口
让你现有的CompanyService继承并实现上面定义的ICompanyService,原有业务逻辑无需修改:
public class CompanyService : ICompanyService { private readonly HttpClient _httpClient; private readonly CompanyClient _companyClient; public CompanyService(string url, string token) { _httpClient = new HttpClient { BaseAddress = new Uri(url), }; _httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers .AuthenticationHeaderValue("Bearer", token); _companyClient = new CompanyClient(url, _httpClient); } // 实现接口定义的GetCompanies方法 public async Task<ICollection<CompanyModel>> GetCompanies() { return await _companyClient.CompanyAsync(); } }
3. 改造调用逻辑
上层调用改为依赖ICompanyService接口,后续替换服务实现无需修改调用代码:
public static async Task Test() { const string ApiAddress = "https://localhost:44309"; try { var authService = new AuthService(ApiAddress); var token = await authService.GetToken("test", "test123"); // 用接口接收实例,解耦调用和实现 ICompanyService companyService = new CompanyService(ApiAddress, token); var companies = await companyService.GetCompanies(); foreach (var company in companies) { Console.WriteLine(company.Name); } } catch (Exception exception) { Console.WriteLine($"ERROR: {exception.Message}"); } }
4. 额外优化建议
- 如果项目使用依赖注入框架,可直接注册接口与实现的映射关系,以.NET内置DI为例:
services.AddScoped<ICompanyService>(sp => { // 可从配置中读取地址、token等参数 return new CompanyService("https://localhost:44309", "your_token"); }); - 可复用
IHttpClientFactory创建HttpClient,避免手动实例化HttpClient带来的套接字资源耗尽问题 - 接口抽象后可直接在单元测试中Mock
ICompanyService的返回值,无需真实发起HTTP请求即可完成业务逻辑测试
内容的提问来源于stack exchange,提问作者TheRobertos
相关产品推荐
相关产品推荐

