【问题标题】:Converting WPF application to follow DDD将 WPF 应用程序转换为遵循 DDD
【发布时间】:2019-07-22 23:40:13
【问题描述】:

我第一次尝试 DDD,结果卡在了中间。

当前设计: 我们目前的设计,不优雅但简单且有效。 Views 绑定到ViewModels,而ViewModels 引用了ServiceClients。当用户在 View 上请求某些东西时,它会改变 ViewModels 的状态,而 ViewModels 反过来会请求 ServiceClients。 ServiceClient 可以同步或异步响应请求。

优点:非常简单的设计,并且有效。

缺点:

  1. 与一切紧密耦合,每个人都需要参考一切来完成工作。
  2. 很大程度上违反了 SOLID。
  3. 上帝无处不在
  4. 根本无法测试!

DDD: 我决定在 DDD 中避难,以摆脱上面提到的所有缺点。这个想法是从ViewModels 中分离出Models,并打破ViewModelsServiceClients 之间的依赖关系。到目前为止一切顺利。

我在这里面临的主要问题是该项目现在变得高度事件驱动。我必须触发很多事件才能执行一个简单的操作。

例如:如果 ViewModel 请求ServiceClients

  • ViewModel 将调用Model 对象上的操作,
  • Model 触发一个由ServiceClients 处理的事件。
  • ServiceClients 将调用 Model 上的操作以发送响应
  • Model 将触发一个事件,由ViewModel 处理以接收响应

问题是: 1. 架构布局是否正确? 2. 完成简单的事情需要事件吗?

感谢您的宝贵时间。

【问题讨论】:

    标签: c# wpf mvvm architecture domain-driven-design


    【解决方案1】:

    在不了解实际用例的足够详细信息的情况下,我敢说您正面临这个问题,因为您只是应用 DDD 的战术模式,而没有在战略方面花费足够的时间。

    让我解释一下。

    即使存在像您这样的现有代码库,您也希望开始考虑系统中的高级边界、关键参与者、他们的行为以及关键参与者之间的交互。您应该识别域中不同的有界上下文以及它们之间的联系。

    更重要的是,您应该尝试在代码库中按原样捕获域功能。我的意思是在应用程序中表示概念以反映领域专家所说的内容。

    如果您使用现有的代码库并直接尝试应用聚合/值对象/域事件等的域建模概念,通常会导致每个人都引用其他人的意大利面条式代码,并且不检查依赖关系。这种相互依赖导致了这样一种情况,即系统某个部分的更新会触发应用程序范围的更改,并且需要广泛使用领域事件。

    进一步阅读:

    【讨论】:

    • 感谢 Subhash 的输入,看来我采用的建模方法没有正确定位。回到书本! :)
    • ? 酷!没有花足够的时间思考应用程序中的核心域、各种子域和边界上下文是使用 DDD 时项目失败的主要原因之一。很好,您意识到可能有问题并开始研究?
    猜你喜欢
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多