domain-driven-design - 将业务逻辑放在 DDD 的何处

标签 domain-driven-design business-logic service-layer

我正在尝试找出构建易于维护和可测试的架构的最佳方法。在经历了几个项目之后,我看到了一些非常糟糕的架构,我想避免在我自己的项目中犯下 future 的错误。

假设我正在构建一个相当复杂的三层应用程序,并且我想使用 DDD。我的问题是,我应该在哪里放置我的业务逻辑?有人说它应该放在服务(服务层)中,这确实有道理。拥有许多遵循单一职责原则的服务是有道理的。

但是,有人说这是一种反模式,不应在服务层实现业务逻辑。为什么是这样?

假设我们有 IAuthenticationService其中有一个方法是 bool UsernameAvailable(string username)签名。该方法将实现所有必需的逻辑来检查用户名是否可用。

根据“这是一个反模式”人群,这里的问题是什么?

最佳答案

如果您将所有业务逻辑放在(隐式无状态)服务层中,那么您就是在编写过程代码。通过将行为与数据分离,您就放弃了编写面向对象的代码。

这并不总是坏事:它很简单,如果您有简单的业务逻辑,就没有理由投资于成熟的面向对象 domain model .

业务逻辑越复杂(域越大),过程代码变成意大利面条式代码的速度就越快:过程开始使用不同的前置和后置条件(以不兼容的顺序)相互调用,并且它们开始需要不断增长的状态对象。

Martin Fowler's article on Anemic Domain Models可能是理解为什么(以及在什么条件下)人们反对将业务逻辑放在服务层中的最佳起点。

关于domain-driven-design - 将业务逻辑放在 DDD 的何处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6891019/

相关文章:

oop - 函数式编程中的领域驱动设计?

node.js - Node.JS服务层设计

entity-framework - 如何避免规则形式的业务逻辑贫乏的领域模型

java - 发送 JPA 包装器对象

c# - DDD : what are the OOP alternatives for procedural Application Services?

java - 服务层中的IllegalArgumentException?

domain-driven-design - 如何干净地(物理地)将域层与 Spring 数据代码分开?

domain-driven-design - 事件验证

c# - 寻找使用评估引擎构建 "TestMaker"(问题和响应)应用程序的技巧

spring - 如何在服务层中结合 JSR-303 和 Spring Validator 类?