#architecture
#архитектура
Вопрос:
Я разрабатываю приложение и использую уровень «сервиса» между моими контроллерами и репозиториями для выполнения проверок модели / бизнеса. Поскольку это многопользовательское приложение (с общей базой данных) Мне нужно выполнить проверки разрешений для всех операций.
Одна вещь, с которой я не уверен, как обращаться, — это возвращаемые типы в случае, если у пользователя нет доступа к определенной операции. Например, скажем, у меня есть метод GetAccountById
. Обычно этот метод возвращает экземпляр Account
объекта (или null
, если таковой не существует). Каким было бы соответствующее возвращаемое значение в случае, если учетная запись действительно существует, но у текущего пользователя нет к ней доступа? На самом деле я не хочу создавать исключение, поскольку это не кажется подходящим вариантом для него. Итак, вопрос в следующем: как мне предупредить потребителя моего уровня сервиса (будь то контроллер или веб-служба) о том, что авторизация недействительна? Должен ли я просто создать какой-то GetAccountByIdResult
тип и включить туда результат функции (включая любые коды «ошибок», фактическую сущность и т.д.)?
Спасибо,
Ответ №1:
Да, то, что я делаю на своем уровне обслуживания, на самом деле всегда включает объект «результат», который содержит bool ошибки, набор сообщений об ошибках (которые вы можете прочитать, если Error
значение true) … а затем фактический объект / ресурс
{
error:true,
messages: ['error1','error2'],
value: { name:'blah' }
}
Комментарии:
1. Есть ли у вас один общий объект «результат» или их много в зависимости от метода?
2. это зависит от используемых технологий … Обычно я стараюсь иметь общий результирующий объект. при доступе к службам rest / json из javascript это действительно упрощает задачу, поскольку json динамически типизируется. если клиент является статически типизированным языком (java, c # и т.д.), То у меня будет либо общий язык со значением ‘object’, либо строго типизированное значение, если ситуация требует этого. Обычно, если я являюсь автором клиента, я использую object, поскольку мне достаточно легко привести результат. Однако, если я пишу для других потребителей, я обычно сильно печатаю
Ответ №2:
Принимая во внимание, что на самом деле мне никогда не приходилось этого делать (насколько я помню)… Я думаю, это зависит от того, где вы применяете авторизацию.
- Если вы применяете это на уровне обслуживания, то вы бы определили это там; я думаю, у вас мог бы быть общий ответ «ошибка» и / или специфические для конкретных служб.
- Если вы примените это на уровне репозитория, то это вернет все, что захочет, и вашему уровню обслуживания придется обработать это и выяснить, что возвращать — что возвращает нас к первому пункту.