我使用以下功能很好,但基本上我会执行相同的操作约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有效
答案 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调用添加一些日志记录,或者也许寻找一些方法来通知调用代码结果错误。