如何在 DDD 中命名域服务

How to name the domain services in DDD

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

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

尝试迭代 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 - 这真的取决于。还要区分域服务(它应该使用纯域对象,一些 "interfaces" 用于复杂的东西 - 或者用于加载)和应用程序服务(它做更多的编排) - 示例:MVC 控制器做:路由,身份验证和授权,数据加载,保存,...无论如何,如果您需要换出实现,创建较小的服务和使用 DI 会有所帮助+它是 solid 中的 S(单一责任原则 - SRP)...实际上在我的 User.Create (IUserCreation) IUserCreation其实就是你的UserCreaitonService的一个接口...

阅读 DDD 我可以建议您查看 Vladimir Khorikov 的文章:https://enterprisecraftsmanship.com/posts/domain-vs-application-services/ 他的文章非常好

现在使用 ORM,DDD 发生了很大变化,并且没有记录这些细节(没有关于它的书)。你能得到的最接近它的东西可以在 我的文章中找到,在 LinkedIn 你可能需要一个 LI 帐户才能访问它们),无论如何链接在这里(如果你喜欢它们,请分享):

  1. 关于 DDD 的系列文章,共 4 篇:https://www.linkedin.com/pulse/code-better-ddd-building-blocks-architecture-uow-due-hideghety/
  2. 使用 ORM 时存储库中的重要差异:https://www.linkedin.com/pulse/orm-repository-pattern-never-good-friends-see-balazs-hideghety/
  3. 使用 DDD 进行单元测试的方法(以及为什么不创建或模拟 dalse 存储库):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 有一个超级方法(不仅仅是基于功能的文件夹结构)但是切片而不是层,所以一定要检查一下(我自己没用过,但它是一个很好的架构模式):https://www.youtube.com/watch?v=wTd-VcJCs_M