我以前没有使用过.Net核心,但在MVC和实体框架方面有很多经验。我的项目有四个不同的文件夹,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方法,它将返回一个数据对象。如何从我的HomeController文件夹中调用API文件夹中的此方法?
发布于 2019-03-14 17:40:32
首先,在您的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;
}
}
}
然后,在ConfigureServices
in Startup.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);
}
这里的代码又快又脏。你应该考虑改进的事情:
IReferenceDataService
。这将使测试更容易。在ConfigureServices
中:
services.AddHttpClient(.)
然后,注入IReferenceDataService
。AddHttpClient
的Polly扩展来支持重试和异常处理策略。至少,您肯定希望添加AddTransientHttpErrorPolicy
:
Services.AddHttpClient(.) .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync(new[] { TimeSpan.FromSeconds(1),TimeSpan.FromSeconds(5),TimeSpan.FromSeconds(10) });
这将处理临时错误,例如暂时无法连接到API,因为它是重新启动或其他什么。您可以在文档上找到更多的信息和更高级的配置可能性。ReferenceData
。相反,您应该始终使用自定义的DTO类,这些类只保存需要通过API获得的数据片段。通过这种方式,您可以控制诸如序列化和自定义验证方案之类的事情,而不会与实体类发生的情况发生冲突。此外,web项目只需要了解ReferenceDataDTO
(或其他什么),这意味着您可以在API和web项目之间与DTO共享一个库,并将DAL完全排除在web项目之外。https://stackoverflow.com/questions/55167763
复制相似问题