我正在研究域驱动设计(DDD)技术,感觉好像我不太了解它。

DDD建议将业务逻辑(不是诸如持久性,安全性之类的基础结构之类的东西)放入域对象,用于持久性的存储库,用于为客户端(演示文稿)组装域对象的聚合器,在域对象和存储库,聚合器之上的薄层服务并充当交易边界。

让我这样说:

在DDD中,ViewController-> SomeService-> {域对象,存储库,聚合器}

在我当前的(过程样式)方法中:
ViewController-> SomeService-> DAO /存储库

在这里,ViewController与一个或多个服务进行对话,以使用DAO将数据从数据库中拉入/推入数据库。如果仅对域对象的属性起作用的任何业务逻辑将位于该域对象本身的方法中。最后,将从服务获得的数据汇总到DTO中,以在View Layer中显示。

所以对我来说,这两种方法几乎都相似。

有人可以向我解释我所缺少的吗?

附注:我正在添加更多信息,以更好地解释我的问题。
从理论上讲,每个人都在说DDD建议“逻辑应该在域对象中”。好。
让我们来看一个真实的场景。

在ShoppingCart应用程序中,一些用户下了订单。要处理订单,我需要执行以下所有子任务:


获取每个项目的详细信息并计算总订单价格。
获取送货地址并使用一些地址验证服务对其进行验证
验证/验证信用卡详细信息
将所有与订单相关的信息保存到数据库中


因此,通过遵循DDD,我将给出逻辑,


Order对象在Order对象中的总计算,该对象遍历其List对象。
在Address Object中,我将具有validate()方法,该方法调用一些BING地址验证。
在CreditCard类中,我将具有authorize()方法,该方法调用某些CCAuthorizationService来使用某些第三方服务进行授权。
使用一些存储库将所有订单物料保存到数据库中。


所有这些步骤将通过调用Order.process()来触发

如果这是正确的DDD方法?如果是这样,我们的域对象将直接与存储库进行交互,这似乎违反了关注点分离。

如果这不是正确的DDD方法,请告诉我您如何设计上述用例?

最佳答案

DDD是独立于语言的,它是关于通过专家了解领域并建立可用来讨论领域的通用语言。因此,它不能直接与功能,过程或面向对象的编程语言进行比较,因为它们不可比较。

视图控制器特定于MVC框架,并不特定于DDD。

在MVC中,用于为视图准备数据的DTO是视图模型。

希望有些帮助。

关于java - 程序代码和域驱动设计样式代码之间有什么区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11906266/

10-12 06:02