首页 > 解决方案 > 使函数更通用以节省重复

问题描述

我使用以下功能,一切都很好,但我基本上做了大约 20 次相同的操作。对于 api 的各种端点,我正在考虑如何使该路由在传递和返回 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”的定义,并且找不到接受“StockTakeDT”类型的第一个参数的可访问扩展方法“GetStockDataFromSage”(您是否缺少 using 指令或程序集参考?) StockAppDL D:\Git\Repos\StockApp\FStockApp\StockAppDal\StockDatabase.cs 76 活动

标签: c#

解决方案


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

我们可以将该逻辑抽象为一个通用方法,该方法接受 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 调用添加一些日志记录,并可能寻找通知调用代码结果错误的方法。


推荐阅读