Domain driven design 可以从另一个应用程序服务中调用一个应用程序服务吗?

Domain driven design 可以从另一个应用程序服务中调用一个应用程序服务吗?,domain-driven-design,service,Domain Driven Design,Service,这是一个ASP.NETMVC网站 按照域驱动设计,我们有一个服务层。我们的控制器要求应用程序服务类执行各种任务,然后将结果路由到视图 业务逻辑由服务类执行 例如,我可能有一个AccountTasks类,负责注册用户、编辑他们的首选项等。现在,我需要能够在用户注册或更新他们的用户首选项后自动订阅新闻稿,然后我会更改新闻稿订阅 因此,时事通讯订阅功能与帐户注册/修改密切相关 但是,我觉得最好有一个单独的NewsletterTasks服务类来处理订阅/更新/取消订阅操作 但是该类不会由控制器使用,而是

这是一个ASP.NETMVC网站

按照域驱动设计,我们有一个服务层。我们的控制器要求应用程序服务类执行各种任务,然后将结果路由到视图

业务逻辑由服务类执行

例如,我可能有一个AccountTasks类,负责注册用户、编辑他们的首选项等。现在,我需要能够在用户注册或更新他们的用户首选项后自动订阅新闻稿,然后我会更改新闻稿订阅

因此,时事通讯订阅功能与帐户注册/修改密切相关

但是,我觉得最好有一个单独的NewsletterTasks服务类来处理订阅/更新/取消订阅操作

但是该类不会由控制器使用,而是由AccountTasks类使用

因此,工作流程如下所示:

-> request made to controller action

-> controller calls AccountTasks

-> AccountTasks creates a user acoount

-> AccountTasks calls NewsletterTasks

-> NewsletterTasks subscribes the user to the newsletter

-> AccountTasks returns the result to the controller

-> controller fetches the appropriate view and sends it to the client
或者,我会让控制器先调用AccountTasks,然后使用结果调用newslettestasks。但是使用这种方法,我觉得控制器对工作流知道得太多了,而它应该简单地传递数据和结果

任务是应用程序服务类,该项目基于Sarp体系结构,并进行了一些修改,其中包括一些东西的命名约定


可以从AccountTasks调用新闻稿Tasks吗?您将如何做到这一点?

我主张控制器调用这两个任务的设计。是的,它给控制器增加了额外的责任,但另一方面,它消除了AccountTasks调用NewsletterTasks的有些尴尬的责任。其他人应决定是否为特定帐户用户订阅时事通讯事件,因为当前所有用户都已订阅

我会实事求是地这样做:只需完成两项任务,我就可以将定义工作流的责任放在控制器中,也许可以用一种单独的方法。如果任务数量增加,我将定义一组特殊的类,其唯一目的是定义工作流


您的设计看起来有点像Juval Lowy的“The Method”,您的任务也有点像他的经理,所以您可以看看他的。我很想创建一个明确的UserRegistration域服务:

这反过来又回答了你的问题:是的,可以从你的服务中心打电话给其他服务


希望有帮助

但是,如果我不引入域服务,您认为AccountTasks调用NewsletterTasks并具有依赖关系(我们使用DI)还可以吗?下面的Szymon说他只是把它放在控制器中,但如果可以的话,我会尽量让我的控制器保持沉默,并将任何业务逻辑委托给服务类。虽然我不愿意再添加一层,但整个架构对我来说已经是一个巨大的飞跃我倾向于同意——保持控制器“沉默”更符合DDD。我引入UserRegistrationService的原因是为了明确域操作。然而,如果你的团队说调用AccountTasks->NewsLetterTasks感觉更自然,那么就这么做吧。DDD是为了使事情更容易理解和更改。如果以后的任务需要调用AccountTasks中的内容,该怎么办?这不会创建循环依赖项吗?
-> request made to controller action

-> controller calls UserRegistrationService

-> UserRegistrationService calls AccountTasks

-> AccountTasks creates a user acoount

-> UserRegistrationService calls NewsletterTasks

-> NewsletterTasks subscribes the user to the newsletter

-> UserRegistrationService returns the result to the controller

-> controller fetches the appropriate view and sends it to the client