Передача HttpStatusCodes через разные слои в приложении веб-API
Я пишу приложение веб-API, которое я разделил на различные проекты, такие как Web, Services, DataAccess - поэтому в основном контроллер веб-API связывается со слоями служб, которые затем могут получить доступ к слою доступа к данным.
Я возвращал просто bool, чтобы сообщить мне, если метод доступа к данным завершился нормально, затем поднял это на уровне обслуживания и затем вернулся к контроллеру..., где я мог бы тогда ответить с HTTPStatusCode 200 или 500 и т. Д...в зависимости от того, вернула ли операция значение true или false.
Вместо bool целесообразно вместо этого использовать HttpStatusCodes... или следует использовать коды состояния HTTP только в контроллере - чтобы вернуть ответ приложению, которое вызывает веб-API, или это должно быть что-то еще?
Спасибо,
3 ответа
Прежде всего, классы должны иметь как можно меньше знаний об окружающем их мире. Предположим, вы реализуете шаблон репозитория для извлечения данных. Ваш репозиторий (слой доступа к данным) не должен даже знать о HTTP, и он не должен быть частью веб-приложения. Его единственное беспокойство - доступ к определенной таблице.
Трудно предложить конкретное решение, не понимая общей картины, но вы можете рассмотреть следующее:
- Вызовите исключение, если ваше приложение зависит от данных, которые не могут быть получены. Это будет распространяться как 500 ответ.
- Используйте enum вместо bool, чтобы сделать код более читабельным.
- Создайте класс DataResponse для инкапсуляции результата операции доступа к данным. Затем вы можете использовать шаблон адаптера для адаптации DataResponse к HttpResponse.
Неясный вопрос, но я попытаюсь ответить.
Это действительно зависит от причины разделения между слоями и от того, чем занимается каждый слой. Я хотел бы задать себе один вопрос: почему у вас есть уровень обслуживания? Это потому, что он содержит бизнес-логику? Это потому, что мы хотим иметь возможность повторно использовать его вне контекста WebAPI? Или вы ожидаете, что уровень сервиса будет зависеть от контекста WebAPI (то есть, что это веб-запрос, а не повторное использование сервиса, скажем, внутри winform).
Скорее всего, вы хотите ограничить работу с деталями HTTP для контроллера (ИМХО, это, очевидно, только мое мнение). Но я бы воздержался от использования этого как жесткого и быстрого правила.
Вы не должны распространять коды состояния http вниз или вверх по линии. Если вы это сделаете, вы вводите зависимость от того, что вы так усердно работали, чтобы отделить. Одна из замечательных особенностей N-уровневой архитектуры заключается в том, что да, ваш веб-уровень может в первую очередь использоваться для взаимодействия с вашим сервисным уровнем, но что происходит, когда вы хотите подключить собственное мобильное приложение для его вызова или службу Windows для вызова это, или настольное приложение, чтобы вызвать это. Вы в основном ограничиваете свой потенциал, пытаясь сохранить эту ошибку вверх и вниз по цепочке.