如何在DDD中命名域服务

问题描述 投票:0回答:1

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

问题是,建议采用这种新方法还是采用以前的方法更好?

java coding-style domain-driven-design code-cleanup ddd-service
1个回答
1
投票

尝试iterate朝向DDD,然后第一步是:面向对象编程。那么,为什么需要用户服务?您可以在User对象本身上使用User.Create(IUserCreator creator)静态方法来完成此操作。尝试将行为封装到它所属的对象中。

只要您只需要一些小数据或什么都可用。通过实体模型(或ORM模型树),您将不需要服务。同样,在许多情况下,domain events可以为您提供很多帮助,可以通过多种方式来实现,一种遵循连续流(我喜欢的一种)或双重调度-请参阅Jimmy Bogard文章:[C0 ]-取决于个人品味和建筑风格...

现在要创建UserService或UserCreationService,UserDeletionService,这确实取决于。还要区分域服务(应该与纯域对象一起使用,某些“接口”用于复杂的东西-或用于加载)与应用程序服务(进行更多的编排)之间的区别-示例:MVC控制器,可以执行以下操作:路由,身份验证和授权,数据加载,保存,...如果您需要换出实施,无论如何创建较小的服务并使用DI都可以提供帮助+实际上是S(单一职责原则-SRP)...实际上在我的User.Create(IUserCreation)中IUserCreation实际上是您的UserCreaitonService的接口...

有关DDD,我建议您从Vladimir Khorikov中检出文章:https://lostechies.com/jimmybogard/2010/03/30/strengthening-your-domain-the-double-dispatch-pattern/他那里确实有很好的文章

现在有了ORM,DDD发生了很大变化,这些细节没有注明(没有书)。您可以在我在LinkedIn上的我的文章中找到最接近的信息,您可能需要一个LI帐户才能访问它们,无论如何链接都在这里(如果您喜欢它们,请分享):

  1. 关于DDD的4篇系列文章:https://enterprisecraftsmanship.com/posts/domain-vs-application-services/
  2. 使用ORM时存储库中的重要差异:https://www.linkedin.com/pulse/code-better-ddd-building-blocks-architecture-uow-due-hideghety/
  3. 使用DDD进行单元测试的方法(以及为什么不创建或模拟dalse存储库):https://www.linkedin.com/pulse/orm-repository-pattern-never-good-friends-see-balazs-hideghety/
  4. 以及使用ORM时的一些陷阱:https://www.linkedin.com/pulse/testing-domain-logic-easy-way-balazs-hideghety/

[此外,在进行MVC时,吉米·博加德(Jimmy Bogard)有一种超级方法(不仅是基于功能的文件夹结构),而且是切片而不是图层,因此请确保您将其签出(自己没有使用过,但这是一种很好的架构模式): https://www.linkedin.com/pulse/get-know-your-orm-avoid-bad-habits-balazs-hideghety/

© www.soinside.com 2019 - 2024. All rights reserved.