При создании сайта мой шаблон часто выглядит следующим образом:
- Контроллеры (сервисы приложений)
- Услуги (доменные службы, инфраструктурные услуги)
- Хранилища
Контроллеры общаются с доменными службами или службами инфраструктуры, а доменные службы могут общаться с репозиториями, службы инфраструктуры обертывают такие вещи, как SMTP и т. Д.
В настоящее время я работаю с идентификацией как с инфраструктурным сервисом, если сервису инфраструктуры или доменному сервису необходимо выяснить, «кто является инициатором», он будет запрашивать сервис идентификации при создании, у сервиса идентификации будут методы / свойства для идентификации invoker, таким образом у меня есть, например, HttpIdentityService, который определяет идентичность по данным сессии / cookie.
Однако я немного застрял в том, как обрабатывать результаты вызовов службы, например ... У меня может быть служба ArticleService, которая имеет метод CreateComment, который просто принимает текст комментария к строке и идентификатор для целевой статьи.
Моя служба приложений (контроллер), вызывает эту службу, возможно, так:
public ActionResult AddComment(int articleId)
{
string commentText = ...;
articleService.CreateComment(articleId, commentText);
...
}
Однако этот метод может завершиться ошибкой, если текущая идентификация не авторизована или не проходит политику, которую проверяет ArticleService (например, возможность комментировать каждые 30 секунд), выбрасывая и перехватывая исключения из вызовов службы, подобные этой кажется очень неправильным, потому что мой вызывающий код не может проверить, действительно ли он может успешно вызвать это действие (исключая фатальные исключения в приложениях) ..
Итак, изначально я начал заставлять сервисы возвращать «результат», результат был бы уникально идентифицирован, чтобы вызывающий мог знать, был ли комментарий действительно сделан (и дополнительно я бы возвращал сущность комментария в результате), результаты будет также определять такие вещи, как «не удалось опубликовать, поскольку пользователь не аутентифицирован», или «не удалось опубликовать, поскольку указанный период охлаждения не был соблюден» (на самом деле я не возвращаю строки, но вы поняли идею).
Моя причина в том, что служба приложений не должна контролировать, должно ли действие вызываться, представьте, что я переместил все проверки личности пользователя и все из службы домена в службу приложений, я у меня есть тонны реплицированного кода, а также предоставление сервисам приложений полного контроля над тем, что может произойти ..
Полагаю, мой вопрос в основном, учитывая, что в домене инфраструктурные службы будут дополнительно применять политику, каков наилучший способ сообщить вызывающему коду, что действие выполнено или не выполнено, и почему.
Заранее спасибо, Стив.