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

Domain driven design DDD:如何将远程服务调用重构(包装)到域中?,domain-driven-design,Domain Driven Design,有一个服务类FooService和名为fetchFoos的方法,它调用远程服务,反序列化JSON响应并返回值对象的图形(从根Foo对象开始)。目前,此远程服务没有其他行为,即我们只是获取一些第三方数据。用DDD术语来说,这是封闭的有界上下文,其唯一目的是使用自己的模型提供数据 我们可以将此方法作为一种服务;但是如果我们能把它改名为更“语言性”的话,似乎会更好 例如,我们可以将singleton服务迁移到一个名为:FooFetcher(有更好的名称吗?)的简单bean,并使用方法fetchFooF

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

我们可以将此方法作为一种服务;但是如果我们能把它改名为更“语言性”的话,似乎会更好

例如,我们可以将singleton服务迁移到一个名为:
FooFetcher
(有更好的名称吗?)的简单bean,并使用方法
fetchFooForBar()
实现同样的功能。然后,我们将简单地创建这个对象的一个新实例并使用它,而不是注入服务

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

然而,其他一些ppl认为应该来自存储库-因此基本上,我们只需要将
FooService
重命名为
foosrepository


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

假设Foo是您的受限上下文中的一个实体,您可以将此服务视为将从存储库调用的基础结构服务

在下面的示例中,我将取数器命名为“FooFetchService”,它有一个名为“getFoo”的方法,返回一个包含foo对象“内容”的JSON字符串

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

这与通过网络与MySQL或其他关系数据库通信的存储库有什么不同吗?除了命名,那对夫妇呢?如果远程系统关闭,会产生什么影响?它有多大可能会下降?很可能不会下降。不过,它不在我们的控制范围内,比如MySql,我们假设它一直处于运行状态。这个“值对象图”是如何使用的?它只是转换为与应用程序相关的模型对象(例如,实体)和值对象。