使功能更通用以节省重复

时间:2019-05-25 14:09:59

标签: c#

我使用以下功能很好,但基本上我会执行相同的操作约20次。对于api的各种端点,我想知道如何使这种路由在传递和返回OF型T的能力上更加通用。

public async Task<List<StockItem>>  GetStockDataFromSage()
{
        StockItem stockitems = new StockItem();
        string content = "";
        List<StockItem> result = new List<StockItem>();
        var uri = new Uri(string.Format(Constants.GetStockItems, string.Empty));

        var response = await _client.GetAsync(uri);

        if (response.IsSuccessStatusCode)
        {
            content = await response.Content.ReadAsStringAsync();
             result = Newtonsoft.Json.JsonConvert.DeserializeObject<List<StockItem>>(content);

        }
        return result;

}

编辑1

我正在尝试使用以下内容,但出现错误

 public async Task<List<StockItem>> GetStockItemInfo()
 {
    return await dataTransfer.GetDataFromSageService(Constants.GetStockItems, string.Empty)) ?? new List<StockItem>();
 }
  

严重性代码描述项目文件行抑制状态   错误CS1061'StockTakeDT'不包含'GetStockDataFromSage'的定义,并且找不到可以接受的扩展方法'GetStockDataFromSage'接受类型为'StockTakeDT'的第一个参数(您是否缺少using指令或程序集引用?)StockAppDL D: \ Git \ Repos \ StockApp \ FStockApp \ StockAppDal \ StockDatabase.cs 76有效

1 个答案:

答案 0 :(得分:3)

这里的目标似乎是调用一个端点,并将结果返回到可以使用的对象中。如果调用成功,则返回结果,如果失败,则返回空列表。

我们可以将该逻辑抽象为一个通用方法,该方法接受url和参数并返回一个对象。

public async Task<T> GetObjectFromEndpoint<T>(string url, params string[] args)
    where T : class
{
    var uri = new Uri(string.Format(url, args));

    var response = await _client.GetAsync(uri);

    if (response.IsSuccessStatusCode)
    {
        var content = await response.Content.ReadAsStringAsync();
        return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(content);
    }

    return default(T);
}

现在,您的GetStockDataFromSage函数传入此调用唯一的信息,即结果的url,参数和通用类型。如果结果为空,则GetStockDataFromSage返回StockItems的空列表

public async Task<List<StockItem>> GetStockDataFromSage()
{
    return (await GetObjectFromEndpoint<List<StockItem>>(Constants.GetStockItems, string.Empty)) ?? new List<StockItem>();
}

每次尝试最小化重复时,您都希望查看此调用的特定内容和更通用的内容。即List<StockItem>,URL和可能的参数是唯一的,但是其余的代码却非常通用。

警告:这种在api调用失败时返回默认值的方法可能会导致难以诊断的问题,您将无法区分空列表和失败的api调用。我建议为失败的api调用添加一些日志记录,或者也许寻找一些方法来通知调用代码结果错误。