Вдохновляя себя Вогом Верноном https://github.com/VaughnVernon/IDDD_Samples, Я смущен, когда решаю, какой API должен иметь доменный сервис:
Служба домена DomainService1
использует домен DomainService2
для выполнения части бизнес-логики. Затем он фильтрует результат Repository1
в соответствии с результатом вызова DomainService2.myMethod
DomainService2
нужны данные, которые не живут в MyCurrentBoundedContext
, а живут в ForeignBoundedContext
Наш обычный подход заключается в реализации сценария использования автономного Service2 следующим образом:
- мы бы включили в
DomainService2.myMethod
подпись объекты домена, необходимые для оправдания логики
- мы бы написали
ApplicationService2
, который предоставил бы точку входа для DomainService2
и использовал бы другой сервис, DomainService3
, отвечающий за получение данных от ForeignBoundedContext
- Обычно мы реализуем
DomainService3
как AntiCorruption Layer
, как это делает Во Вернон в своей TranslatingCollaboratorService
Теперь наша проблема заключается в применении этого шаблона для разработки DomainService1
, поскольку он содержит значительную предметную логику:
мы могли бы обернуть DomainService1
в сам ApplicationService1
, из которого мы сначала вызовем ApplicationService2
, а затем мы передадим его результат всему результату до DomainService1
. Недостатком этого подхода является то, что API DomainService1
следует вызывать для включения аргументов, которые необходимы только потому, что DomainService1
обычно использует DomainService2
для выполнения части работы
Мы могли бы удалить ApplicationService2
, изменить подпись DomainService2
(таким образом изменив первую точку нашего обычного подхода) и включить только идентификаторы. Затем мы создадим реализацию DomainService2
, которая будет находиться в пакете инфраструктуры и будет использовать DomainService3
, отражая поведение "старого" ApplicationService2
. Это кажется более естественным, чем изменение подписи DomainService1, но нам не нравится идея размещать в реализации службы домена ту же логику, которую мы используем в службе приложений.
Где живет граница между ApplicationService и реализацией доменной службы?