Лучшей практикой будет «ничего из вышеперечисленного». Ваши представления должны отправлять события, которые контроллер или компонент Command будут использовать для вызова ваших служб, а затем обновлять вашу модель при возврате данных. Ваши представления будут привязаны к данным, и затем представления будут автоматически обновляться новыми данными.
Я предпочитаю иметь один класс обслуживания для каждого фрагмента или типа данных, которые я получаю - это упрощает создание фиктивных сервисов, которые могут быть заменены на реальные сервисы по мере необходимости в зависимости от того, что вы делаете (например, если у вас сложная настройка сервера, разработчик, работающий над скинингом, будет использовать макеты) Но на самом деле то, как вы это делаете, зависит от личных предпочтений.
Итак, где живут ваши службы, чтобы контроллер или команда могли получить к ним доступ? Если вы используете платформу Dependency Injection, такую как Robotlegs или Swiz, у нее будет отдельный объект, который обрабатывает экземпляры, хранит и возвращает экземпляры объектов модели и сервисных объектов (в случае Robotlegs он также создаст ваши объекты Command для вас). и может создавать объекты управления видом, называемые посредниками). Если вы не используете ни одну из этих платформ, вам нужно «свернуть свою собственную», что может быть немного сложно, если вы не архитектурно настроены.
Одна вещь, к которой склонны прибегать люди, которые не знают, как кататься самостоятельно (например, люди, которые написали более старые версии Cairngorm), - это Singletons. Это не считается хорошей практикой в наше время, особенно если вы вообще заинтересованы в модульном тестировании своей работы. http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/