Схожи ли роли сервиса и фасада?

Чем больше читаю, тем больше путаюсь.

Обратите внимание, что все вопросы связаны с тем, как сервис и фасады вписываются в шаблон MVC.

Насколько я понимаю, Фасад - это не супер-умный объект, это просто способ предоставить простой интерфейс/API для выполнения сложной операции (например, выполнить платеж в размере 10 долларов, это сложная операция, которая включает в себя ряд операции, но такая сложность может быть обработана фасадом, который просто вызовет соответствующий объект в определенном порядке... и т.д...)

Теперь сервис — это способ выполнения вызовов нескольких DAO для получения сложных структур данных (я не слишком в этом уверен, но пока это то, что я понимаю).

Тогда вопрос в том, в чем разница между фасадом и услугой? В конце концов, фасад может прекрасно обращаться к нескольким DAO для выполнения сложной операции, предоставляя простой интерфейс, и сервис кажется чем-то похожим.

То же самое происходит и с транзакциями, я понимаю, что сервис — это место для запуска транзакций, но я также считаю, что их также можно разместить на фасадах, в конце концов, фасад может также вызывать несколько DAO.

Итак, какой стек будет иметь больше смысла

контроллер-фасад-дао контроллер-сервис-дао

или, может быть

контроллер-фасад-дао И иногда контроллер-фасад-сервис-дао ??


person Juan Antonio Gomez Moriano    schedule 23.02.2013    source источник
comment
Фасад, обычно применяемый в бизнесе, делает API вашего приложения. Служба данных — это только ваша служба. Кроме того, вы можете использовать Façade во многих местах вашего кода. Сделать САЛ. Таким образом, это стало сервисом доступа к API. Фасад - это узор, который делает Апи.   -  person Davut Gürbüz    schedule 26.02.2013
comment
Основное различие между фасадом и сервисом A заключается в том, что сервис действительно что-то делает, т. е. определение класса на самом деле содержит всю необходимую логику. Чистый фасад, IMO, не должен содержать никакой логики, кроме того, что необходимо для делегирования фактической работы сервису по конвейеру.   -  person kolossus    schedule 03.03.2013
comment
Имея контроллер dao, у вас нет разделения между обработкой запросов и логикой. Обычно фасад использовался для преобразования объектов dto в сущности и использования дао для сохранения данных. Там для дао классы отделены от объектов dto и контроллеров от сущностей. Кроме того, бизнес-логика реализована на фасаде, который несет единую ответственность. Там для контроллера-фасада-дао это обязательно, также можно использовать сервис.   -  person USer22999299    schedule 05.03.2020


Ответы (11)


Служба — это способ написания интерфейса для внешней системы, такой как хранилище удостоверений LDAP, платежный шлюз или интерфейс управления приложениями. Это концептуальный взгляд на внешнюю систему как на поставщика полезных услуг, возможно, с внутренним поведением, а не как на пассивную массу, над которой нужно работать.

Фасад — это способ обернуть что-либо (включая сервис), чтобы красиво представить его другому компоненту. Фасады часто используются, когда:

  • Библиотека или компонент сложны, и вашему приложению требуется только их часть. Ваш Фасад представляет упрощенный API для приложения
  • Вы используете несколько библиотек или компонентов и вам необходимо их унифицировать, представив приложению единый API
  • Библиотека, которую вы используете, имеет сложную настройку или набор зависимостей, а фасад оборачивает все это в контексте вашего приложения.

Что действительно сбивает с толку, так это то, что вы можете (и часто делаете) создать фасад над одним или несколькими сервисами. Служба — это то, как компонент фактически получает доступ к ресурсу, а фасад — это то, что упрощает компонент (например, настройку параметров, подключение и т. д.).

Если вы напишите свой собственный DAO, вы, вероятно, создадите свой сервис именно так, как вам нужно, поэтому написание фасада является признаком того, что вы сделали это неправильно. Если DAO создан третьей стороной и более сложен, чем ваши потребности, тогда вы можете фасадировать сервис.

Теперь служба — это способ выполнения вызовов нескольких DAO для получения сложных структур данных (я не слишком уверен в этом, но пока это то, что я понимаю).

Я бы сказал, что DAO — это собственный шаблон проектирования — см. википедию.

Если мы сравним DAO со службой, мы получим:

  • Level of API:
    • DAO: Fine-grained access to properties
    • Служба: грубый доступ к службам
  • Where implementation lies:
    • DAO: Mainly on the client, but storing data (without behavior) in the database
    • Сервис: В основном на сервере
  • How the interface is invoked
    • DAO: The client directly binds to the object in the same namespace and JVM
    • Служба: клиент — это просто заглушка для работы в сети, между виртуальными машинами или между пространствами имен.

... фасад может прекрасно обращаться к нескольким DAO для выполнения сложной операции, предоставляя простой интерфейс, и сервис кажется чем-то похожим.

Фасад может обернуть слой DAO, но я не вижу в этом полезного способа. Скорее всего, вам нужен API для доступа к отдельным свойствам объектов, обхода графа объектов и тому подобного, и это именно то, что предоставляет DAO.

То же самое происходит с транзакциями, я понимаю, что служба - это место для начала транзакций...

Безусловно, потому что транзакция — это услуга, предоставляемая базой данных и другим компонентом или системой.

... но я в равной степени чувствую, что их также можно разместить на фасадах, в конце концов, фасад может также вызывать несколько DAO.

И во многих отношениях служба диспетчера транзакций является фасадом гораздо более сложной серверной реализации, координирующей транзакцию в Интернете, приложении, базе данных и других компонентах, поддерживающих транзакции. Однако это уже абстрагировано реализацией службы транзакций. Что касается нас, пользователей, то есть только публичный интерфейс.

В этом, собственно, и заключается концептуальный смысл этих шаблонов проектирования — предоставить пользователю ровно столько API, сколько нужно, абстрагировавшись от сложностей реализации за железную стену компонентного интерфейса.

Итак, какой стек будет иметь больше смысла

контроллер-фасад-дао контроллер-сервис-дао

или, может быть

контроллер-фасад-дао И иногда контроллер-фасад-сервис-дао ??

  1. DAO — это своего рода служба для базы данных, но на самом деле DAO — это сам шаблон проектирования.
  2. Если вы пишете свой собственный DAO, вам никогда не понадобится фасад.

Поэтому правильный ответ:

  • контроллер - дао
person Andrew Alcock    schedule 26.02.2013
comment
Как правило, мне нравится думать о DAO как об очень атомарных элементах (например, объект UserDAO может иметь метод getUserById()), они очень связаны, поэтому для выполнения определенных операций (например, оплата пользователем может включать в себя получение пользователем , извлечение его банковского счета... и т. д.) нередко в конечном итоге звонят в несколько DAO, не лучше ли предоставить Facade для таких случаев? - person Juan Antonio Gomez Moriano; 27.02.2013
comment
Ваше наблюдение за связностью имеет решающее значение — вы должны раскрыть эти детализированные методы, чтобы DAO был полезен для приложения (скорее всего, у вас есть страница в приложении для просмотра или редактирования этих свойств). Однако цель Фасада состоит в том, чтобы полностью скрыть эти аспекты, так что это не кажется правильным, если вы иногда идете прямо за ним. Обязательно добавьте вспомогательный метод для завершения такой операции, как оплата, но это скорее вспомогательный метод, чем Фасад. - person Andrew Alcock; 27.02.2013
comment
Приветствую, но тогда в чем основная разница между методом Facade и Helper, в конце концов, такой метод, как payUser(), может быть идеальной частью класса FacadeUser, не так ли? - person Juan Antonio Gomez Moriano; 27.02.2013
comment
В конце концов, это все код — шаблоны проектирования — это просто способ рассказать о том, как вы организуете свой код, и они названы в честь их назначения. Это очень помогает, когда вы разговариваете с другими людьми, которые тоже «в теме». Это жаргон. Фасад — это набор вспомогательных методов, целью которых является скрытие библиотеки или группы библиотек от приложения (фасад здания скрывает уродливые части за ним). Итак, на одном уровне вы правы, но если вы получите доступ к остальным, это разрушит назначение имени и, таким образом, запутает других разработчиков, поэтому жаргон больше не помогает. - person Andrew Alcock; 27.02.2013

Буквально, Фасад, как следует из названия, означает переднюю часть здания. Люди, идущие мимо дороги, видят только фасад, ничего не знают о том, что внутри, проводка, трубы и прочие сложности. Лицо скрывает все сложности здания и отображает более простое дружелюбное лицо.

С точки зрения программного обеспечения, facade скрывает за собой сложности программных компонентов, предоставляя более простой интерфейс, не имеет собственной функциональности и не ограничивает доступ к подсистеме. Обычно используется в объектно-ориентированном дизайне. Хорошими примерами являются SLF4J — это API, который представляет собой простой фасад для систем ведения журналов, позволяющий конечному пользователю подключать желаемую систему ведения журналов во время развертывания.

Служба — это общедоступный интерфейс, который обеспечивает доступ к функциональной единице и всегда записывается в соответствии со спецификацией. Он должен поддерживать коммуникационные контракты (связь на основе сообщений, форматы, протоколы, безопасность, исключения и т. д.), которые требуются его различным потребителям. Есть сервисы обработки — инкапсуляция бизнес-процессов, сервис бизнес-логики — инкапсуляция правил/функций, сервисы данных — взаимодействие с сущностями, доступ к данным управление, службы инфраструктуры – служебные функции, такие как мониторинг, ведение журналов и безопасность. Сервисы в основном представляют собой повторно используемые, несвязанные, слабосвязанные единицы функциональности.

Они очень похожи, но зависит от того, как вы на это смотрите.

Разница, которую я вижу, Фасады спроектированы наизнанку. Вы смотрите на подсистему и проектируете фасад, чтобы обеспечить более простой доступ. Услуги разрабатываются снаружи. Вы смотрите на своего клиента/клиентов, определяете контракт и разрабатываете услугу.

person Manish Singh    schedule 26.02.2013
comment
Спасибо, user395072, я не могу найти лучших слов, чтобы описать различия. Фасады .. обеспечивают более простой интерфейс, не имеют собственной функциональности и не ограничивают доступ к подсцэму, ..., Сервисы в основном повторно используемые, неассоциированные, слабосвязанные единицы функциональности. поставил точку. :) - person devBinnooh; 03.03.2013
comment
Отличное, простое объяснение. - person i.brod; 25.12.2019

Мое понимание классического шаблона GoF Facade заключается в том, что он в основном предназначен для того, чтобы скрыть плохой дизайн. Как правило, я бы сказал, что Facade нужен только для устаревшего кода.

Я также думаю, что этот шаблон стал основным шаблоном J2EE (Фасад сеанса) главным образом потому, что спецификация EJB (по крайней мере, до 2.x) по своей сути приводила к плохому дизайну сервисного уровня.

Таким образом, мой ответ на ваш вопрос будет да -- фасад на самом деле является сервисом, который не был должным образом реализован с первого раза. Если вам нужно скрыть сложность от клиентского кода, это обычно означает, что вам удалось предоставить только библиотеку, а не сервисный уровень; так что в этом случае Facade фактически становится вашим сервисным слоем.

С другой стороны (при условии, что у вас есть приличный уровень домена), если вам действительно нужно предоставить возможность создания сложных потоков с помощью одного вызова метода (что-то вроде макросов/псевдонимов), это обычно лучше разместить на уровне приложения и не в вашем основном домене -- обратите внимание, что я переключил терминологию многоуровневости на дизайн, ориентированный на домен, где нет "доступа к данным" или "сервисного" уровня, но есть "приложение", "домен", "инфраструктура".

person Costi Ciudatu    schedule 01.03.2013
comment
Имеет ли смысл использовать фасады для управления версиями? того же API? - person Juan Antonio Gomez Moriano; 04.03.2013

Обычно эти термины используются только в их конкретном контексте.

  • Общий контекст использования «Фасад»: простой API для сложных частей приложения (например, сторонних библиотек)

  • Контекст «Услуги»: разблокируйте и выведите на поверхность бизнес-объекты в системе. (SOA, DAO, безопасность и т. д.)

Вы можете рассматривать шаблоны как язык, который развивается. Никогда не казалось, что это идеальный конец, у каждого паттерна есть своя история и контекст. Иногда классы можно рассматривать как Сервисы и Фасады одновременно, иногда нет.

Например: вызов стороннего API по термину «Сервис» может рассматриваться как неправильное использование из-за неправильного контекста.

person IlliakaillI    schedule 23.02.2013
comment
Иногда классы можно рассматривать как Сервисы и Фасады одновременно, я так думаю. Сервис может находиться в Фасаде. @+1 Вы очень понятно объяснили. - person Davut Gürbüz; 26.02.2013

Первое, что нужно отметить, это то, что шаблон проектирования — это описание общей (проектной) проблемы со стандартным решением. В некоторых случаях есть несколько способов решить проблему таким образом, чтобы он соответствовал всем требованиям (например, шаблоны Iterator и Singleton имеют множество различных реализаций; например, проверьте работу Alexandrescu и сравните ее со стандартным GoF решения), а в некоторых случаях существуют разные шаблоны с одним и тем же (кодовым) решением (например, сравните диаграммы классов шаблонов Composite и Decorator в книге GoF).

Согласно GoF цель шаблона Facade состоит в том, чтобы (буквальная цитата):

Обеспечить унифицированный интерфейс для набора интерфейсов в подсистеме. Facade определяет интерфейс более высокого уровня, упрощающий использование подсистемы.

Службы предназначены для предоставления пользователю единого интерфейса более высокого уровня с заданной функциональностью. Это не обязательно делает его фасадом, потому что сервис, строго говоря, не является unified interface to a set of interfaces in a subsystem. по определению.

Но мы можем добиться большего успеха

Ваш вопрос заключался в том, являются ли шаблоны «похожими». Если считать их «похожими», когда образец А равен В, а образец В равен А, то мы должны ответить на 2 вопроса:

Вопрос 1: является ли Service Facade? Служба определенно должна раскрывать функциональность и, безусловно, представляет собой единый интерфейс, который предоставляет эту функциональность. Функциональность обычно разбивается на крошечные части, так что да, услуги соответствуют основным требованиям фасада. Другими словами: столкнувшись с проблемой представления базовых интерфейсов в качестве унифицированного «служебного» интерфейса, шаблон фасада соответствует требованиям и используется для решения проблемы обслуживания. Ответ на этот вопрос да.

Вопрос 2: является ли Facade Service? Сервисы обычно разрабатываются как повторно используемые, несвязанные, слабосвязанные единицы функциональности. Думать о связи между компонентами важно для служб, поскольку они обычно полагаются на интерфейс TCP/IP, такой как SOAP или WCF. Это также означает, что функциональность часто переписывается, чтобы более точно соответствовать парадигме services, что добавляет к шаблону неявное управляемое производительностью требование. Фасады не имеют этого дополнительного требования. Другими словами: фасад — это не услуга.

В точных терминах эти понятия тесно связаны, но не совпадают.

Но мы можем добиться большего успеха

Такой ход мыслей поднимает вопрос, является ли сервис расширенной версией фасада? Это если услуга соответствует всем требованиям фасада и распространяется поверх него.

Если вы внимательно прочитаете описание GoF, ответ будет утвердительным, то есть при соблюдении одного условия: служба должна открывать подсистемы. На самом деле, я думаю, что это условие обычно выполняется, или вы чрезмерно проектируете свои услуги, хотя, строго говоря, я полагаю, что это не жесткое ограничение.

person atlaste    schedule 27.02.2013

FACADE — это шаблон проектирования, который решает проблему, когда требуется унифицированный интерфейс для многих интерфейсов в подсистеме, поэтому он определяет интерфейс более высокого уровня, упрощающий использование подсистемы.

ОДНАКО СЛУЖБА обеспечивает доступ к ресурсам или набору интерфейсов/объектов и не обязательно упрощает такой доступ. Таким образом, вы можете использовать шаблон фасада для улучшения дизайна вашего сервиса, чтобы вы могли избавить клиента от выяснения того, как его использовать.

person Samuel    schedule 04.03.2013

Интерфейс службы обычно представляет бизнес-задачи: выполнение некоторых операций и/или получение некоторой информации. Для поставщика услуг было бы разумно реализовать свой сервис как фасад над внутренними внутренними сервисами — вы никогда этого не увидите.

Ваш фасад может заключать в себе некоторые общие интерфейсы, которые могут включать в себя сервисные интерфейсы.

Например, у вас может быть сервисный интерфейс для банковского счета (операция: Банк переводит деньги) и локальный API для ваших локальных учетных записей (Я перевожу деньги). Вы можете ввести фасад с операцией «перевести деньги», которая использует интерфейс обслуживания банка и также управляет вашей местной чековой книжкой.

person Richard Sitze    schedule 26.02.2013

Прежде чем я попытаюсь ответить, позвольте мне кое-что пояснить: в корпоративных приложениях есть три разных вещи: Фасад, Сервисный уровень и Удаленный фасад.

Фасад — при обертывании подсистем(ы) он по-прежнему является объектом, а приложение пользовательского интерфейса (MVC) обычно находится в одном и том же процессе. Таким образом, общение осуществляется в обычном ОО-режиме: вызов методов, чтение свойств, прослушивание событий.

Служебный уровень — когда уровень бизнес-логики становится зрелым и слишком сложным для MVC, чтобы взаимодействовать с ним напрямую, между ними помещается сервисный уровень. Service Layer — это API, который MVC использует в качестве оболочки бизнес-логики. Он не является удаленным и не требует использования DTO, поскольку для связи не используется провод.

Удаленный фасад — (просто любая удаленная служба) представляет собой гибрид фасада и уровня обслуживания. Удаленный фасад начинает существовать, когда вы хотите выставить какую-то оболочку над системой (и мы называем ее Фасадом) в качестве границы распространения. Одной из причин может быть разрешение нескольким приложениям пользовательского интерфейса (MVC) использовать один и тот же удаленный фасад.

-

Сравнения:

Фасад и Сервисный уровень: они похожи, поскольку обе они являются оболочкой для подсистем. Отличие заключается в том, что сервисный уровень больше ориентирован на потребности приложений пользовательского интерфейса (MVC) и предоставляет функции для упрощения работы с бизнес-логикой. С другой стороны, Facade предоставляет функциональные возможности для упрощения бизнес-логики, но не обязательно упрощает взаимодействие с приложением пользовательского интерфейса (MVC).

Facade и Remote Facade (Service?): определенно разные, поскольку Remote Facade должен использовать DTO в качестве коммуникационных сообщений. Remote Facade понадобится какой-то прокси, если вы все же хотите использовать его как обычный объект (свойства, события); но прокси все равно будет использовать DTO для реального объекта, т.е. удаленного фасада.

-

Возможные потоки:

controller-facade-dao - сомнительно, но все же возможно. Фасад обычно не используется для переноса только DAL. В качестве подсистемы должно быть что-то более зрелое. Но, если фасад является частью бизнес-логики, то да, это возможно. Тем не менее, подсистема должна быть более подчеркнута. Для меня упаковки DAL недостаточно, чтобы называть ее Facade.

controller-service-dao - вполне возможно. Многие удаленные сервисы работают напрямую с базой данных через DAL.

controller-facade-service-dao - возможно, если рассматривать сервис как подсистему.

Я бы добавил еще один, который может иметь смысл:

controller-service [layer]-facade (part of business)-subsystem (e.g. accounting, business on its own)-dao - Уверен, ты сможешь это перевести.

-

Помните, Сервис (или удаленный фасад) может существовать где угодно в потоке. Это просто продиктовано вашими потребностями в дистрибутиве.

person Tengiz    schedule 01.03.2013

Да, Facade и Service не совсем не связаны. И некоторое время мы реализуем сервисный слой как Фасад, чтобы клиент не беспокоился о многих деталях сервиса. Чем проще вызов/интерфейс службы, тем проще и легче клиентский код.

Мартин Фаулер говорит...

Сервисный уровень определяет границы приложения [Cockburn PloP] и его набор доступных операций с точки зрения взаимодействующих клиентских уровней. Он инкапсулирует бизнес-логику приложения, контролируя транзакции и координируя ответы при реализации своих операций.

Таким образом, уровень сервисов иногда используется как Facade.

Ссылка

person rai.skumar    schedule 26.02.2013

Это "контекст", который имеет значение. Фасад и Сервис не конфликтуют.

Во-первых, я никогда не слышал о «Сервисе» и «Фасаде» в контексте MVC.

Когда люди говорят об услуге, это больше о системе или компоненте, обеспечивающем значимые для бизнеса действия с внешним миром. Иногда вы можете увидеть «Сервис», связанный с «Единицей работы» (и, следовательно, с транзакцией).

Служба также используется в контексте некоторого многоуровневого подхода приложения: у нас есть служба поверх DAO, для которой служба будет получать доступ к данным через DAO, а бизнес-логика помещается на уровень службы, что-то в этом роде.

Фасад обычно используется в контексте шаблона проектирования, и основное внимание уделяется «сокрытию сложных операций и представлению их как простой операции».

Фасад может быть, а может и не быть Сервисом (операция в Фасаде может не представлять Единицу работы, но по-прежнему является действительным фасадом), аналогично Сервис может быть Фасадом, а может и не быть (Сервис не может скрывать каких-либо сложных операции, но это все еще служба).

Опять же, все дело в «контексте».

Например, когда вы говорите о многоуровневости приложения, просто иррационально говорить «XXX — это фасад для доступа к DAO». Точно так же, если вы говорите о «подходе к проектированию», более разумно сказать «XXX — это фасад для нескольких серверных частей», а не называть его здесь «Сервисом» (хотя XXX на самом деле является Сервисом).

person Adrian Shum    schedule 26.02.2013

Facade и Service Layer имеют некоторое сходство, но оба они имеют два различных значения. Позвольте мне объяснить это на простом примере.

Представьте, что нас просят создать новое бизнес-приложение. Для этого требуется создать приложение для регистрации, но с дополнительными функциями и функциями карты лояльности.

Допустим, приложение должно поддерживать функции регистрации Facebook и Foursquare, если пользователь хочет их использовать. Эта функция крайне необходима, поскольку некоторые пользователи неохотно используют несколько приложений, выполняющих одну и ту же функцию, или отказываются от социальных сетей.

чтобы получить общее представление, обратитесь к образцу API по следующей ссылке https://docs.google.com/file/d/0B3v8S0e-PvVpdWFJOVhqc1d2SHc/edit?usp=sharing

Вышеприведенный API регистрации, расположенный на фасаде ABC, является примером использования Facade.

Он имеет API нашего сервиса, а также возможности регистрации через Facebook и Foursqure в зависимости от выбора клиента. API-интерфейсы Facebook и Foursqure могут иметь определенные реализации (SOAP, Restful и т. д.), требования безопасности (OAuth и т. д.) и т. д.

Удовлетворение требований одного из этих API (facebook, Foursqure) требует выполнения другого набора задач. это будут разные подсистемы, указанные в нашем требовании регистрации.

Таким образом, упрощенное использование фасада заключается в удовлетворении нескольких подсистем, запускаемых одним простым методом.

Но если мы рассмотрим наш собственный API, который представляет собой API регистрации, расположенный по адресу MngCheckinSvc. Это API сервисного уровня. Это API, который содержит требования регистрации нашего приложения. Это API, предоставляющий публичный доступ из вашего MngCheckinSvc для обработки требований регистрации к приложению.

Это будет иметь сложное внутреннее поведение, но все же большинство из них будут реализациями логики для конкретного приложения.

Этот API(MngCheckinSvc.checkin(....)) может иметь доступ к другому набору DAO, внутренних API, может быть другим внутренним сервисом и т. д. для выполнения регистрации продавца в приложении.

person Chamantha De Silva    schedule 03.03.2013