Я написал общие методы для получения, отправки и размещения.Пример Get Generic Method :
public async Task<object> GetAsync<T>(string uri, NamingStrategy namingStrategy)
{
using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, uri))
{
return await ProcessAsync<T>(requestMessage, namingStrategy);
}
}
и ProcessAync :
public async Task<object> ProcessAsync<T>(HttpRequestMessage request, NamingStrategy namingStrategy)
{
if (!string.IsNullOrEmpty(AuthToken))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AuthToken);
}
HttpResponseMessage response = await _client.SendAsync(request);
if (response.IsSuccessStatusCode)
{
_logger.LogInformation("Request Succeeded");
var dezerializerSettings = new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver
{
NamingStrategy = namingStrategy
}
};
T responseModel = JsonConvert.DeserializeObject<T>(await response.Content.ReadAsStringAsync(), dezerializerSettings);
return responseModel;
}
else
{
return await GetFailureResponseModel(response);
}
}
, чем я вызываю этот метод get, какчто в моем SingletonClass
public async Task<object> GetShops(string category)
{
_logger.LogInformation("ClubMatas outgoing request: {RequestName}", nameof(GetShops));
return await _client.GetAsync<ShopsResponseModel>($"v2/shops?category={WebUtility.UrlEncode(category)}");
}
И этот метод вызывается в моем контроллере следующим образом
public async Task<ActionResult<object>> GetShops([FromQuery(Name = "category")]string category)
{
var response = await _httpClient.GetShops(category);
return ParseResponse<ShopsResponseModel>(response);
}
и ParseResponse равно
protected ActionResult<object> ParseResponse<T>(object response)
{
if (response.GetType() == typeof(T))
{
return Ok(response);
}
else
{
return Error(response);
}
}
Как показывает цепочка вызовов, я ожидаю, что в моем Api-ответе будут другие SuccessModel или FailureModel, и в связи с этим я должен использовать object в качестве возвращаемого типа.Но у меня есть чувство, что я не должен использовать тип object для возврата.К вашему сведению выше цепочка работает отлично.Я просто ищу больше рефакторинга или улучшения моего текущего потока.ищу более элегантное решение этой проблемы.Пожалуйста, предложите любое другое решение для моей проблемы.
Обновление Я попытался @ChrisPratt предложить использовать интерфейс, но это решение не работает, или, возможно, я делаю это неправильно.Итак, я создал этот пустой интерфейс
public interface IResult
{
}
И я расширил и мой ShopResponseModel
и FailureResponseModel
из IResult
интерфейса, и обновил методы, подобные этому.
public async Task<IResult> GetShops(string category)
{
_logger.LogInformation("ClubMatas outgoing request: {RequestName}", nameof(GetShops));
return await _client.GetAsync<IResult>($"v2/shops?category={WebUtility.UrlEncode(category)}");
}
и
public async Task<T> GetAsync<T>(string uri, NamingStrategy namingStrategy)
{
using (var requestMessage = new HttpRequestMessage(HttpMethod.Get, uri))
{
return await ProcessAsync<T>(requestMessage, namingStrategy);
}
}
и я обновил ProcessAsync
тип возврата с объект до T .Но получаю ошибки.