我正在通过领域驱动设计(DDD)技术,我觉得我还不太了解它。
DDD建议将业务逻辑(不是基础设施,如持久性,安全性等)放在域对象,持久性存储库,聚合器中,用于组装客户端的域对象(表示),服务是域对象之上的薄层,存储库,聚合器和充当事务边界。
让我这样说吧:
在DDD中,ViewController - > SomeService - > {Domain Objects,Repositories,Aggregators}
以我目前的(程序式)方法: ViewController - > SomeService - > DAO /存储库
此处,ViewController与一个或多个服务进行通信,以使用DAO从/向数据库提取/推送数据。如果任何仅对Domain对象的属性进行操作的业务逻辑将位于该Domain对象本身的方法中。最后,从服务获得的数据被聚合到DTO中,以便在View Layer中显示。
所以对我来说,这两种方法看起来几乎相似。
有人可以解释一下我缺少的东西吗?
P.S:我正在添加更多信息以更好地解释我的问题。 从理论上讲,每个人都在说DDD建议“逻辑应该在域对象中”。好。 让我们采取一个真实的场景。
在ShoppingCart应用程序中,某些用户下了订单。要处理订单,我需要执行以下所有子任务:
获取每件商品的详细信息并计算总订单价格。
获取递送地址并使用某些地址验证服务验证
验证/验证CreditCard详细信息
将所有订单相关信息保存到DB
因此,通过关注DDD,我将把逻辑
Order Order对象中的总计算,它循环遍历List对象。
在地址对象中,我将使用validate()方法调用某些BING地址验证。
在CreditCard类中,我将使用authorize()方法调用某些CCAuthorizationService来授权使用某些第三方服务。
使用一些存储库将所有订单内容保存到数据库中。
调用Order.process()
将触发所有这些步骤如果这是正确的DDD方法?如果是,我们的域对象直接与存储库交互,这似乎违反了关注点分离。
如果DDD方法不正确,有人可以告诉我你如何设计上述用例?
答案 0 :(得分:1)
归结为逻辑所处的位置。在DDD中,逻辑主要进入模型层,因此它保持在数据附近。在过程代码中,逻辑进入事务层,因此它与数据分离。福勒有一个很好的描述,你可以阅读here。
答案 1 :(得分:1)
DDD与语言无关,它是通过专家了解域并构建一个可以与之讨论域的通用语言。所以它不能直接与功能,程序或面向对象的编程语言进行比较,因为它们不具有可比性。
View Controllers特定于MVC框架,并不特定于DDD。
在MVC中,用于为视图准备数据的DTO将是视图模型。
希望其中一些有用。
答案 2 :(得分:0)
他们 相似。
希望您实际上将“OOP”与“DDD”进行比较。 DDD是OOP(IMO)的子集,或者至少应该在OOPL中。 DDD是一种思考破坏责任的特定方式。
答案 3 :(得分:0)
这不是关于技术或OOP或类似的东西。 它专注于手头的领域,领域专家使用的语言,理解领域和建模领域,以便代码中存在重要的概念。
最初是使用OOP完成的,许多人声称它只能使用OOP完成。 然而,最近像Greg Young这样的人已经展示了如何在函数式语言中使用DDD,并且仍然将重点放在域名上。
程序代码倾向于忽略所有这些,只关注如何从任何数据源读取/写入数据。例如与Movex这样的系统集成将有十亿个表格和列,其中包含完全延迟的名称,如TAXEM.YAROOD FOOB.AAR,这对任何阅读该代码的人都毫无意义......