如何在DDD中命名领域服务

4
我是DDD的新手,使用DDD原则编写新项目时遇到了创建领域服务的问题。我通常使用相应的领域对象名称前缀来命名我的服务,例如UserServiceOrderService,并将与DO相关的所有业务逻辑方法放入这些服务中。因此,我有一个UserService,例如,其中包含用于创建新用户、禁用现有用户、执行其他用例等方法。
现在我注意到,我可以为每个用例创建一个服务,而不是为每个DO创建一个大型服务。例如,一个名为CreateUserService的服务和另一个名为RemoveUserService的服务等。

问题是,这种新方法推荐吗?还是之前的方法更好?

1个回答

4
尝试朝向DDD迭代,第一步是:面向对象编程。那么为什么需要用户服务呢?你可以在User对象本身上拥有一个User.Create(IUserCreator creator)静态方法来完成这个技巧。尝试将行为封装到它所属的对象中。
只要您只需要一些小数据或当所有内容都可通过实体模型(或ORM模型树)获得时,您就不需要服务。此外,在许多情况下,领域事件可以帮助您很多,这些可以以多种方式实现,其中之一是遵循连续流(我喜欢的一种),或者双重调度-请参见Jimmy Bogard文章:https://lostechies.com/jimmybogard/2010/03/30/strengthening-your-domain-the-double-dispatch-pattern/ - 这取决于个人口味和架构......
现在,如果要创建UserService或UserCreationService,UserDeletionService,则真的取决于情况。还要区分领域服务(应该使用纯领域对象,一些“接口”用于复杂的东西-或用于加载)和应用程序服务(执行更多的编排)-示例:MVC控制器执行路由,身份验证和授权,数据加载,保存等。无论如何,创建较小的服务并使用DI可以帮助您更换实现+它是solid(单一责任原则-SRP)中的S......实际上,在我的User.Create(IUserCreation)中,IUserCreation实际上是您的UserCreaitonService接口......
关于DDD,我建议您查看Vladimir Khorikov的文章:https://enterprisecraftsmanship.com/posts/domain-vs-application-services/他有非常好的文章。
现在随着ORM的发展,DDD也发生了很大变化,但这些细节没有被记录下来(没有相关书籍)。关于这个最接近的东西可以在我的文章中找到,在LinkedIn上(如果您喜欢它们,请分享),您可能需要一个LI帐户才能访问它们。
  1. 一系列有关DDD的文章:https://www.linkedin.com/pulse/code-better-ddd-building-blocks-architecture-uow-due-hideghety/
  2. 使用ORM时repository的重要区别:https://www.linkedin.com/pulse/orm-repository-pattern-never-good-friends-see-balazs-hideghety/
  3. 使用DDD进行单元测试的方法(以及为什么不要创建或模拟假仓储库):https://www.linkedin.com/pulse/testing-domain-logic-easy-way-balazs-hideghety/
  4. 当使用ORM时需要注意的问题集合:https://www.linkedin.com/pulse/get-know-your-orm-avoid-bad-habits-balazs-hideghety/

此外,在进行MVC开发时,Jimmy Bogard提出了一种非常好的架构模式,不仅仅是基于功能的文件夹结构,而是采用“slice”而非“layer”,建议您查看:https://www.youtube.com/watch?v=wTd-VcJCs_M(本人未使用过,但是这是一种好的架构模式)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接