域驱动设计 - 外部数据API作为存储库或服务

sjb*_*101 7 service domain-driven-design infrastructure repository

在使用域驱动设计开发的博客应用程序中,"Post"实体具有相关的标签实体集合.

在创建帖子(例如,从UI填充对象)时,我想通过REST调用第三方API,该API获取帖子的内容并提取语义标签(链接文本)以进行关联.

主要问题:设计这个的最佳方法是什么......

它是否设计得最好,以便Post实体可以调用域服务,如PostServices.GetTags(Postcontent)传递其内容并检索标签列表.

**PostServices.GetTags将通过另一个包装类与REST API接口.

或者第三方API是否应该作为存储库包装?

函数Post.GenerateTags()应该不存在于域实体中吗?

更多问题:

1:我还读过,让域实体与域服务交谈是不好的做法.这是真的?

2:通过工厂创建方法获取对PostServices域服务的引用是否可以.例如..

IPostService PostService = ServiceUtil.GetPostService(); return PostService.GetTags(Post.content);

3:域服务是否可以与第三方API连接?

4:域实体是否应该只知道如何处理通过调用REST API的应用层接收的标签.

慢慢地试图让我的头围绕DDD,但我似乎无法找到任何如何实现这种事情的例子.

yer*_*ero 4

在博客应用程序中,帖子是实体,标签是值对象。标签没有身份。你应该有:

  • 帖子库
  • 职位(实体)
  • 标签(值对象)

帖子有一个标签列表。

问题:

1:我还了解到,让域实体与域服务进行对话并不是一个好的做法。这是真的?

是的,这不是一个好的做法。您的实体不想与域服务耦合。如果您这样做,那么以后就无法重复使用它们。您是否考虑过触发域事件?你可以告诉你的服务域做一些触发域事件的事情。

2. : 通过工厂创建方法获取PostServices域服务的引用可以吗?例如.IPostService PostService = ServiceUtil.GetPostService(); 返回 PostService.GetTags(Post.content);

是的,这是可能的。工厂方法可以返回抽象类或接口。这是一个很好的软件设计原则“为接口编码而不是为实现编码”。如果您这样做,您以后将能够更改您的实现,而不必更改您的客户端代码。

3:域服务耦合第三方API是否可以接受?

我不推荐你这样做,但这是可以接受的。

抱歉,我不明白问题4。

看这个链接。我希望它对你有帮助。

/sf/ask/63102371/#901562