Возвращаемые значения для функций уровня обслуживания

#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:

Принимая во внимание, что на самом деле мне никогда не приходилось этого делать (насколько я помню)… Я думаю, это зависит от того, где вы применяете авторизацию.

  • Если вы применяете это на уровне обслуживания, то вы бы определили это там; я думаю, у вас мог бы быть общий ответ «ошибка» и / или специфические для конкретных служб.
  • Если вы примените это на уровне репозитория, то это вернет все, что захочет, и вашему уровню обслуживания придется обработать это и выяснить, что возвращать — что возвращает нас к первому пункту.