DDD:如何将远程服务调用重构(包装)到域中?

时间:2014-10-18 15:56:29

标签: domain-driven-design

有一个服务类FooService和名为fetchFoos的方法,它调用远程服务,反序列化JSON响应并返回值对象的图形(从根Foo对象开始)。目前,此远程服务没有其他行为,即我们只是获取一些第三方数据。用DDD术语来说,这是封闭的有限环境,其唯一目的是使用自己的模型提供数据。

我们可以将此方法作为服务;但是......如果我们可以将它重命名为更具语言性的东西,那似乎会更好。

例如,我们可以将单例服务迁移到名为FooFetcher的简单bean(任何更好的名称?),并使方法fetchFooForBar()执行相同操作。然后,我们将简单地创建此对象的新实例并使用它,而不是注入服务。

我甚至认为FooFetcher是一个错误的域名,它应该只是Foos,方法是fetchForBar()

然而,其他一些人认为应该来自存储库 - 所以基本上,我们只需要将FooService重命名为FooRepository

关于如何在DDD中封装远程服务的任何集体智慧?

1 个答案:

答案 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。您可以在需要它的任何其他服务类中注入它。