如何在 DDD 中命名域服务
How to name the domain services in DDD
我是 DDD 的新手,在使用 DDD 原则编写新项目时遇到问题,该项目与创建域服务有关。我总是用相应的域对象名称前缀来命名我的服务,例如 UserService
或 OrderService
并将与 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 帐户才能访问它们),无论如何链接在这里(如果你喜欢它们,请分享):
- 关于 DDD 的系列文章,共 4 篇:https://www.linkedin.com/pulse/code-better-ddd-building-blocks-architecture-uow-due-hideghety/
- 使用 ORM 时存储库中的重要差异:https://www.linkedin.com/pulse/orm-repository-pattern-never-good-friends-see-balazs-hideghety/
- 使用 DDD 进行单元测试的方法(以及为什么不创建或模拟 dalse 存储库):https://www.linkedin.com/pulse/testing-domain-logic-easy-way-balazs-hideghety/
- 以及使用 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
我是 DDD 的新手,在使用 DDD 原则编写新项目时遇到问题,该项目与创建域服务有关。我总是用相应的域对象名称前缀来命名我的服务,例如 UserService
或 OrderService
并将与 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 帐户才能访问它们),无论如何链接在这里(如果你喜欢它们,请分享):
- 关于 DDD 的系列文章,共 4 篇:https://www.linkedin.com/pulse/code-better-ddd-building-blocks-architecture-uow-due-hideghety/
- 使用 ORM 时存储库中的重要差异:https://www.linkedin.com/pulse/orm-repository-pattern-never-good-friends-see-balazs-hideghety/
- 使用 DDD 进行单元测试的方法(以及为什么不创建或模拟 dalse 存储库):https://www.linkedin.com/pulse/testing-domain-logic-easy-way-balazs-hideghety/
- 以及使用 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