ASP.NET Web API - 调用带有存储库模式问题的第二个 API

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

我正在尝试创建一个可以调用另一个 API 并将一些数据存储在 SQL 数据库中的 API,即:

Client -> HTTP GET/POST -> API -> calls 2ND API -> stores data in SQL

我已经通过控制台应用程序实现了这一点:

using System.Net;
using System.Net.Http.Headers;
using System.Text.Json;
using WebApiClient.Data;
using HttpClient client = new();
  
client.DefaultRequestHeaders.Accept.Clear();

var breweries = await ProcessBreweriesApiAsync(client);

foreach (var brew in breweries)
{
    Console.WriteLine($"id: {brew.Id}");
    Console.WriteLine($"name: {brew.Name}");
    Console.WriteLine($"brewery_type: {brew.BreweryType}");
    // Console.WriteLine($"address_1: {brew.Address1}");
    // Console.WriteLine($"address_2: {brew.Address2}");
    // Console.WriteLine($"address_3: {brew.Address3}");
    // Console.WriteLine($"city: {brew.City}");
    // Console.WriteLine($"state_province: {brew.StateProvince}");
    // Console.WriteLine($"postal_code: {brew.PostalCode}");
    // Console.WriteLine($"longitude: {brew.Longitude}");
    // Console.WriteLine($"latitude: {brew.Latitude}");
    // Console.WriteLine($"phone: {brew.Phone}");
    // Console.WriteLine($"state: {brew.State}");
    // Console.WriteLine($"street: {brew.Street}");
    Console.WriteLine("Saving data into SQL");
    
    var db = new AppDbContext();
    db.Breweries?.AddRange(breweries);
    db.SaveChanges();

    Console.WriteLine("Finished Saving");
    Console.WriteLine();
}

static async Task<List<BreweryModel>> ProcessBreweriesApiAsync(HttpClient client)
{
    await using Stream stream =
        await client.GetStreamAsync("https://api.openbrewerydb.org/breweries");
    var breweries =
        await JsonSerializer.DeserializeAsync<List<BreweryModel>>(stream);
    return breweries ?? new();
}

但是,我现在尝试使用 ASP.NET Web API 实现相同的功能,使用我在之前的教程中学到的几个概念,例如存储库模式来习惯这些概念,我似乎无法弄清楚如何构建这个。

我在接口中创建了一个方法sig,然后是该方法的异步实现,但是,这个错误表明我没有实现该接口,但是当我将接口更改为异步时,我得到:

“async”修饰符只能在具有主体的方法中使用。CS1994

控制器:

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

    public BreweryController(IBreweryRepo repository)
    {
        _repository = repository;
    }

    [HttpGet(Name = "UpdateBreweries")]
    public ActionResult<IEnumerable<BreweryModel>> UpdateBreweries()
    {
        Console.WriteLine("Updating Breweries Now...");
        var breweries = _repository.ImportBreweries();
        _repository.SaveChanges();
        return Ok (breweries);
    }
}

接口:

using XXX.Models;

namespace XXX.Data
{
    public interface IBreweryRepo
    {
        Task ImportBreweries ();
        bool SaveChanges();
    }
}

实施:

namespace XXX.Data
{
    public class BreweryRepo : IBreweryRepo
    {
        //DI 
        private readonly AppDbContext _context;

        public BreweryRepo(AppDbContext context)
        {
            _context = context;
        }

        //public async IActionResult UpdateBreweries <BreweryModel<List>> (HttpClient client)
        public async Task UpdateBreweries()
        {
            HttpClient client = new HttpClient();
            await using Stream stream =
            await client.GetStreamAsync("https://api.openbrewerydb.org/breweries");
            var breweries =
            await JsonSerializer.DeserializeAsync<List<BreweryModel>>(stream);
            _context.Breweries.AddRange(breweries);
        }

        public bool SaveChanges()
        {
            return (_context.SaveChanges() >= 0);
        }
    }
}

似乎无法让它异步加载。

c# .net rest entity-framework
1个回答
0
投票

第一个错误: 尽管返回类型很好,但接口“ImportBreweries”中的方法名称与其具体实现“UpdateBreweries”不同。接口及其实现必须与方法的签名匹配。

第二个错误: 接口定义了要实现的类的契约。异步行为是特定于方法的实现细节,因此它不是接口契约的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.