如何从.Net Core中的API访问数据

问题描述 投票:1回答:1

我之前没有使用.Net Core,但是在MVC和Entity Framework方面有很多经验。我的项目有四个不同的文件夹,API,DTO,Repository和WEB。 DTO文件夹有许多适合数据模型的模型文件。 API文件夹有一个名为ReferenceDataController的Controller文件,如下所示

[Route("api/[controller]")]
[ApiController]
public class ReferenceDataController : ControllerBase
{
    private readonly IReferenceDataRepository _repository;

    public ReferenceDataController(IReferenceDataRepository repository)
    {
        _repository = repository;
    }

    // GET api/values
    [HttpGet]
    public ActionResult<ReferenceData> GetReferenceData()
    {
        return _repository.GetReferenceData();
    }

我被告知,如果我调用这个GET方法,它将返回一个数据对象。如何从我的WEB文件夹中的HomeController在API文件夹中调用此方法?

api asp.net-core visual-studio-2017 dbcontext dto
1个回答
1
投票

首先,在您的Web项目中,您需要进行一些设置。添加如下所示的类:

public class ReferenceDataService
{
    private readonly HttpClient _httpClient;

    public ReferenceDataService(HttpClient httpClient)
    {
        _httpClient = httpClient ?? throw new ArgumentNullException(nameof(httpClient));
    }

    public async Task<List<ReferenceData>> GetReferenceDataAsync(CancellationToken cancellationToken = default)
    {
        using (var response = await _httpClient.GetAsync("/api/referencedata", cancellationToken))
        {
            if (response.IsSuccessStatusCode())
            {
                return await response.Content.ReadAsAsync<List<ReferenceData>>();
            }

            return null;
        }
    }
}

然后,在ConfigureServicesStartup.cs

services.AddHttpClient<ReferenceDataService>(c =>
{
    c.BaseAddress = new Uri("https://api.example.com");
    // Use the actual URL for your API here. You also probably want to get this
    // from `Configuration` rather than hard-coding it.
});

最后,将ReferenceDataService注入你的HomeController

public class HomeController : Controller
{
    private readonly ReferenceDataService _referenceDataService;

    public HomeController(ReferenceDataService referenceDataService)
    {
        _referenceDataService = referenceDataService ?? throw new ArgumentNullException(nameof(referenceDataService));
    }

    // In your action(s):
    // var data = await _referenceDataService.GetReferenceDataAsync(HttpContext.RequestAborted);
}

这是快速而脏的代码。你应该考虑改进的事情:

  1. 使用服务类的接口,即IReferenceDataService。这将使测试更容易。在ConfigureServicesservices.AddHttpClient<IReferenceDataService, ReferenceDataService>(...); 然后,注入IReferenceDataService
  2. 您可以而且应该使用带有AddHttpClient的Polly扩展来支持重试和异常处理策略。至少,你肯定想添加AddTransientHttpErrorPolicyservices.AddHttpClient<ReferenceDataService>(...) .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10) })); 这将处理暂时性错误,例如暂时无法连接到API,因为它已重新启动或其他。您可以在docs找到更多信息和更高级的配置可能性。
  3. 您应该使用单独的DTO类。为简洁起见,我只使用了你的(推测的)实体类ReferenceData。相反,您应该始终使用自定义DTO类,这些类只包含您需要通过API提供的数据部分。这样,您可以控制序列化以及自定义验证方案等内容,而不会与实体类的内容发生冲突。此外,Web项目只需要了解ReferenceDataDTO(或其他),这意味着您可以在API和Web项目之间与DTO共享库,并使您的DAL完全脱离Web项目。
© www.soinside.com 2019 - 2024. All rights reserved.