Что я хочу сделать, так это записать статус HTTP-вызова, чтобы я мог дать пользователю некоторую обратную связь в пользовательском интерфейсе, вместо того, чтобы либо добиться успеха, либо показать мрачную ошибку.
То, что я сделал, создало Result класс. Для простоты я покажу простой класс, но у меня также есть его как общий класс, поэтому он также может содержать данные.
В Result класс:
public class Result
{
public bool IsSuccess { get; set; }
public string Error { get; set; }
public HttpStatusCode HttpStatusCode { get; set; }
public Result() { }
public Result(bool isSuccess)
{
IsSuccess = isSuccess;
}
public Result(string errors, bool isSuccess)
{
IsSuccess = isSuccess;
Error = errors;
}
public Result(string errors, bool isSuccess, HttpStatusCode statusCode)
{
Error = errors;
IsSuccess = isSuccess;
HttpStatusCode = statusCode;
}
}
Когда я вызываю API, который использую, я использую Result класс, как показано ниже:
public async Task<Result> UpdateColour(GrapeColour grapeColour)
{
var body = new StringContent(JsonConvert.SerializeObject(grapeColour), Encoding.UTF8, "application/json");
var client = _httpClient.CreateClient(ApiNames.WineApi);
var response = await client.PutAsync(_grapeColourUrl, body).ConfigureAwait(false);
if (response.IsSuccessStatusCode)
{
return new Result(true);
}
else
{
return await HttpResponseHandler.HandleError(response).ConfigureAwait(false);
}
}
Где моя HttpResponseHandler делает кое-что, но в основном пишет bool isSuccessful значение false, вывести сообщение об ошибке и установить код состояния.
Все это живет в моем Domain слой.
Затем я передаю это веб-стороне своего проекта, вот метод контроллера:
[HttpPost]
public async Task<IActionResult> EditColour(Result<EditableGrapeColourViewModel> model)
{
if (!ModelState.IsValid)
{
return View(new Result<EditableGrapeColourViewModel>(model.Data));
}
var domainGrapeColour = _grapeMapper.Map<Domain.Grape.GrapeColour>(model.Data);
var saveResult = await _grapeService.SaveColour(domainGrapeColour, SaveType.Update).ConfigureAwait(false);
if (saveResult.IsSuccess)
{
return RedirectToAction("EditColour", "Grape", new { id = model.Data.Id, IsSuccess = true });
}
var viewModel = new Result<EditableGrapeColourViewModel>(saveResult.IsSuccess, saveResult.Error, model.Data);
return View(viewModel);
}
Итак, модель, которую я использую для модели представления и представления, должна быть Result<T> так что я могу получить доступ к isSuccessful и сообщение об ошибке для отображения пользователю.
Я использую automapper для сопоставления объекта моего домена с объектом в веб-проекте, но я использую домен Result.
Итак, у меня двоякий вопрос; Является ли то, что я делаю, достойным решением для того, что я хочу делать? И если это так, следует ли мне использовать домен Result объект как я?
