Я имею в виду, должна ли это быть обязанностью службы или контроллер должен определять, какой код состояния возвращать на основе результата службы?
Сегодня в моей команде мы заставляем службы возвращать код состояния и сообщение, а также полезные данные через общий объект-оболочку из класса Response. Поэтому, когда мы хотим вернуть, например, список пользователей, сервис делает что-то похожее на
Код: Выделить всё
if (!users?.Any() ?? true)
return new Response()
{
Message = "There are no users.",
Status = HttpStatusCodes.Status204NoContent
}
return new Response()
{
Message = "Users retrieved successfully!",
Status = HttpStatusCodes.Status200OK,
Data = users
}
Одна из альтернатив для этого — вернуть некоторый объект Result из Службы в Контроллер, но выполнить некоторую обработку данных в промежуточном программном обеспечении, преобразуя объект Result в эффективный объект Response, содержащий код состояния.
/>Это может быть что-то вроде этого:
Код: Выделить всё
// Result object returned by services
public class Result
{
public string Message { get; }
public ResultReason Reason { get; }
public T Data { get; set; }
}
public enum ResultReason
{
BusinessRuleViolation, ItemNotFound, Success, InvalidParameter
}
// Response object returned by a middleware as an HTTP response body
public class Response
{
public string Message { get; }
public int StatusCode { get; }
public T Data { get; set; }
}
public static class ResultMapper
{
public static Response ToResponse(this Result result)
{
return new Response()
{
Data = result.Data,
Message = result.Message,
StatusCode = result.Reason == ResultReason.BusinessRuleViolation ? 422
: result.Reason == ResultReason.ItemNotFound ? 204
: result.Reason == ResultReason.Success ? 200
: result.Reason == ResultReason.InvalidParameter ? 400
}
}
}
Примечание. Приведенный выше пример не обязательно работает, я написал его только в демонстрационных целях
Подробнее здесь: https://stackoverflow.com/questions/779 ... case-class
Мобильная версия