【发布时间】:2017-01-24 09:43:03
【问题描述】:
为了让我的应用程序正常工作,我需要定期同步来自外部服务的数据(可以是 API,也可以是简单的文本文件,但目前它是一个 API)。
由于这需要一次创建/更新许多实体,我需要创建一个域服务。但是,我还需要创建一些包含远程 API 响应的 DTO 对吗?
这个逻辑应该去哪里?我应该有以下目录结构:
Domain -
Model - // my set of entities and repository interfaces are here
....
Synchronization -
RunSynchronizationService.php // domain service
Application
Synchronization -
SynchronizeData.php // application service
SynchronizationDataSourceInterface.php // used by application service
MySpecificRemoteApiDataSource.php // this implements the interface above
SynchronizationDataSourceResponse.php // this would be returned by each call of SynchronizationDataSourceInterface method, and would contain data normalized, but not validated.
Infrastructure -
MyConcreteImplementationOfModelEntityRepository.php
当我想同步数据时,我只需调用 Application\Synchronization\SynchronizeData 的同步方法,它将采用 SynchronizationDataSourceInterface 的具体实现,调用其方法,并在将返回的 SynchronizationDataSourceResponse 对象传输到 Domain\Model\ 之前对其进行验证同步\运行同步服务?
或者我应该删除 RunSynchronizationService(域服务)并让应用程序服务 (SynchronizeData.php) 在同步过程的每个步骤中创建/更新域实体?
【问题讨论】:
-
我可能错了,但我在这里闻到了一些过度设计的味道。我的第一个建议是在一个(子)包中隔离同步。我的第二个建议是,为什么不从一个小服务开始,等你更好地了解它的角色后让它发展。
-
@IhorBurlachenko 问题是同步过程比较大。我必须从 API 中为每个实体获取并验证 5 到 10 个响应,其中至少有 700 个
-
然后我会隐藏同步(子)包中的所有细节。我不会在域层中放置任何东西。如果我理解正确,同步与域无关,而只是您的应用程序处理数据的方式。
-
同步其实是提供数据让应用工作的方式,不过我猜是一样的
-
我认为 Ihor 可能试图传达的信息(如果我错了,请原谅我,Ihor),您应该将该服务视为可以用竞争供应商替换的小部件。因此,隔离包,但定义域的交互点在结构上比服务本身提供的内容更重要。我通常会在别处(例如通过应用层)创建外部服务实例。然后,我将通过在域或公共区域中定义的接口将该服务传递给需要它的域操作。
标签: php service domain-driven-design