我正在学习领域驱动设计(DDD)技术,我觉得我还没有很好地理解它。
DDD 建议将业务逻辑(不是基础设施,如持久性、安全性等)放入域对象、持久性存储库、为客户端(演示)组装域对象的聚合器、域对象和存储库之上的薄层服务、聚合器并充当事务边界。
让我这样说:
在 DDD 中,ViewController --> SomeService --> {Domain Objects, Repositories, Aggregators}
在我当前的(程序风格)方法中:ViewController --> SomeService --> DAO/Repository
在这里,ViewController 与一个或多个服务对话,以使用 DAO 从/向数据库拉取/推送数据。如果仅对域对象的属性进行操作的任何业务逻辑将在该域对象本身的方法中。最后,从服务获得的数据被聚合到 DTO 中,以呈现在视图层中。
所以对我来说,这两种方法看起来都差不多。
有人可以解释一下我错过了什么吗?
PS:我正在添加更多信息以更好地解释我的问题。理论上每个人都在说 DDD 建议“逻辑应该在域对象中”。好的。让我们来看一个真实的场景。
在 ShoppingCart 应用程序中,一些用户下了订单。要处理订单,我需要执行以下所有子任务:
获取每个项目的详细信息并计算总订单价格。
获取收货地址并使用一些地址验证服务对其进行验证
验证/验证信用卡详细信息
将所有订单相关信息保存到数据库中
因此,通过遵循 DDD,我将提出逻辑,
Order 对象中的 Order Total 计算,该对象循环遍历其 List 对象。
在地址对象中,我将拥有调用一些 BING 地址验证的 validate() 方法。
在 CreditCard 类中,我将拥有 authorize() 方法,该方法调用一些 CCAuthorizationService 来授权使用一些第三方服务。
使用一些存储库将所有订单内容保存到数据库中。
所有这些步骤都将通过调用 Order.process() 来触发
如果这是正确的 DDD 方法?如果是这样,我们的域对象直接与存储库交互,这似乎违反了关注点分离。
如果这不是正确的 DDD 方法,有人可以告诉我您如何为上述用例设计吗?