Записать статус http-вызова для отображения в пользовательском интерфейсе

Что я хочу сделать, так это записать статус 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 объект как я?

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *