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

时间:2010-02-16 11:49:17

标签: repository domain-driven-design service infrastructure

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

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

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

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

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

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

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

更多问题

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

2:通过工厂创建方法获得对PostServices域服务的引用是否可以。 e.g ...

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

3:将域名服务与第三方API相结合是否可以接受?

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

慢慢地试图了解DDD,但我似乎无法找到任何关于如何实现此类事情的例子。

1 个答案:

答案 0 :(得分:3)

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

  • PostsRepository
  • 发布(实体)
  • 标签(价值对象)

帖子有一个标签列表。

问题:

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

是的,这不是一个好习惯。您实体不希望与域服务耦合。如果您这样做,那么以后就无法重复使用它们。您是否考虑过发布域名活动?您可以告诉您的服务域执行某些火灾域事件。

<强> 2。 :通过工厂创建方法获得对PostServices域服务的引用是否可以。例如:IPostService PostService = ServiceUtil.GetPostService();返回PostService.GetTags(Post.content);

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

3:将域名服务与第三方API相结合是否可以接受?

我不建议你这样做,但这是可以接受的。

抱歉,我不明白问题4。

看这个链接。我希望它可以帮到你。

https://stackoverflow.com/questions/901462/ddd-where-is-it-most-appropriate-to-get-a-list-of-value-objects/901562#901562