Language agnostic 在域驱动设计中,服务可以调用其他服务吗?

Language agnostic 在域驱动设计中,服务可以调用其他服务吗?,language-agnostic,domain-driven-design,Language Agnostic,Domain Driven Design,有时,我正在编写的某些服务需要其他服务实现的功能。例如,在编写一个服务时,返回某个ID的用户在一次交易后购买的产品,我需要用户购买产品后的帐户余额,因此我调用另一个服务来获取数据 我可以看到一些替代方案: 这样做很好,因为您正在重用代码 服务应访问其自己的repo以检索其操作所需的数据 服务应该彼此隔离,并且只适用于单个域。在我的示例中,我应该有另一个层(可能是ViewFactory)来调用服务以获取相关数据 在这个问题上,什么是公认的准则?您的问题是关于应用程序或基础设施服务,而不是应用程序或

有时,我正在编写的某些服务需要其他服务实现的功能。例如,在编写一个服务时,返回某个ID的用户在一次交易后购买的产品,我需要用户购买产品后的帐户余额,因此我调用另一个服务来获取数据

我可以看到一些替代方案:

  • 这样做很好,因为您正在重用代码

  • 服务应访问其自己的repo以检索其操作所需的数据

  • 服务应该彼此隔离,并且只适用于单个域。在我的示例中,我应该有另一个层(可能是ViewFactory)来调用服务以获取相关数据

  • 在这个问题上,什么是公认的准则?

    您的问题是关于应用程序或基础设施服务,而不是应用程序或基础设施服务?如果是这样的话,DDD没有关于将域服务彼此隔离的具体指导原则。运用你的判断力,观察违规行为。还要记住,域服务经常被误用,因此有必要:

    应该明智地使用服务,不允许剥夺实体和值对象的所有行为


    你可以。。。如果它适合您的特定领域上下文,特别是您的用例

    如果您有几个可能跨越多个聚合根及其服务的用例,那么您可能希望使用内部应用程序服务或域EventHandler来保持其完整性

    但我感觉到您不想使用UserRepository在当前服务中加载用户,因为您觉得它应该关注其上下文

    我的经验是,服务方法的粒度变化很大。如果您的服务只针对一个(或几个)存储库工作,我假设您的粒度很好-这意味着您有SaveOrder、LoadOrder、DeleteOrder、LoadUser等

    大粒度更面向用例,并尝试将一个用例与服务方法(或两个)相匹配。但是OrderService可能有GetUserPurchaseHistory()之类的方法

    此方法返回响应DTO对象中具有帐户余额的产品。如果您不想使用DTO,您可能需要两次服务调用,两次返回产品和用户帐户余额。 但请记住,应用程序服务层的主要任务是服务于应用程序客户机及其需求。如果您不敢将粒度变大,您可能会将域逻辑推到代码隐藏/controller/presenter/webservices。然后,您将以正确的顺序调用应用程序服务方法的知识强加于您的客户机

    我在一些项目中成功地在复杂的对话框中使用了DTO对象,该对话框需要跨越多个聚合的数据。这将使GUI人员更加容易,并且服务api更加面向流程。是的。。。我将需要的几个存储库注入到我的服务中。我有几个共享存储库的服务(没有严格的1对1关系)。对于不太复杂的用例,我不使用DTO。DTO为您提供了应用程序维护期间的开销、成本、时间和复杂性。虽然它可以提供一个反腐败层,但你很少能得到这个好处回来

    我希望你能理解你可以采取的不同方式以及利弊。
    只是我对您的“十字路口”的看法…

    很抱歉,我的回复太晚了,是的,是关于域服务的。