尝试向 DDD迭代,然后第一步是:面向对象编程。那么为什么需要用户服务呢?您可以在 User 对象本身上使用User.Create(IUserCreator creator)静态方法来解决问题。尝试将行为封装到它所属的对象中。
只要您只需要一些小数据或一切都可用。通过实体模型(或 ORM 模型树),您将不需要服务。同样在很多情况下,域事件可以为您提供很多帮助,这些可以通过多种方式实现,一种遵循连续流(我喜欢的那种)或双重调度 - 请参阅Jimmy Bogard文章:https ://lostechies.com/jimmybogard/ 2010 年 3 月 30 日/加强你的领域的双重调度模式/ - 这取决于个人品味和架构......
现在,如果要创建 UserService 或 UserCreationService,UserDeletionService - 这真的取决于。还要区分域服务(应该与纯域对象一起使用,一些用于复杂内容的“接口” - 或用于加载)和应用程序服务(进行更多的编排) - 示例:MVC 控制器执行:路由、身份验证和授权,数据加载,保存,...无论如何,如果您需要换出实现,则创建较小的服务和使用 DI 会有所帮助+它是来自实体的 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