有一个服务类FooService
和名为fetchFoos
的方法,它调用远程服务,反序列化JSON响应并返回值对象的图形(从根Foo
对象开始)。目前,此远程服务没有其他行为,即我们只是获取一些第三方数据。用DDD术语来说,这是封闭的有限环境,其唯一目的是使用自己的模型提供数据。
我们可以将此方法作为服务;但是......如果我们可以将它重命名为更具语言性的东西,那似乎会更好。
例如,我们可以将单例服务迁移到名为FooFetcher
的简单bean(任何更好的名称?),并使方法fetchFooForBar()
执行相同操作。然后,我们将简单地创建此对象的新实例并使用它,而不是注入服务。
我甚至认为FooFetcher
是一个错误的域名,它应该只是Foos
,方法是fetchForBar()
。
然而,其他一些人认为应该来自存储库 - 所以基本上,我们只需要将FooService
重命名为FooRepository
。
关于如何在DDD中封装远程服务的任何集体智慧?
答案 0 :(得分:4)
假设Foo是有界上下文中的实体,您可以将此服务视为将从存储库调用的基础结构服务。
在以下示例中,我将fetcher命名为" FooFetchService"它有一个名为" getFoo"返回带有"内容"的JSON字符串; foo对象
public interface FooRepository {
public Foo getById(String fooId);
}
public class RemoteFooRepository implements FooRepository {
@Inject
FooFetchService fooFetchService;
public Foo getById(String fooId) {
String returnedFoo = fooFetchService.getFoo(fooId);
/* add code here to deserialize the JSON contents of the returnFoo variable to an object Foo foo*/
return foo;
}
}
RemoteFooRepository只是FooRepository的一个实现,恰好通过一些远程服务检索Foo。您可以在需要它的任何其他服务类中注入它。