【问题标题】:DDD project with AngularJs (SPA) web interface...is it a good idea?带有 AngularJs (SPA) Web 界面的 DDD 项目......这是个好主意吗?
【发布时间】:2015-07-06 00:35:58
【问题描述】:

我开始使用 DDD 指南实施企业应用程序。 首先,我和我的团队正在开始我们的 DDD 之旅,所以我们有很多东西要学习和理解(如果我说了什么,请原谅我......愚蠢=>)

该应用将是一个(非常定制的)CMS。 该项目将具有:

  • 使用 Microsoft 堆栈(C#、WebAPI、EF6)开发的域和后端
  • 使用 AngularJs 开发为 SPA 的前端

我最大的疑问与在富客户端应用程序中如何(以及在​​多大程度上)使用域有关......我的意思是,如果所有逻辑都驻留在域对象(后端)中, FE和BE之间的沟通应该如何发展?系统是否应该为 FE 侧的实体所做的每一次更改都做一种乒乓球比赛?

或者我应该做出一些妥协吗?有人有过类似经历吗?

【问题讨论】:

  • 问题标题可以改进。 “是个好主意”征求意见。当......要求具体解决方案时,如何减少所需的乒乓球次数
  • 您的问题非常广泛。好吧,答案可能很长:) --- 我倾向于将域视为旧的物理计算器。它具有输入数据/行为的机制(键盘)和输出机制(屏幕/打印机)。无论您使用什么输入或输出机制都不会影响域。它是隔离的并执行一些业务功能。希望对您有所帮助:)
  • 我很抱歉这个广泛而不清楚的问题,你没事。实际上,我正在努力让自己的头脑清醒一点,更深入地了解在我的解决方案中实现 CQRS 模式,以便正确地分离利益和责任。
  • @Gnegno 富域主要有助于确保写入的一致性。 UI 可能会调用域以执行某些业务规则(Web 服务),但大多数简单的验证规则都可以简单地在 UI 中复制。我知道,这似乎很难接受,但是尝试自动从域对象中提取业务规则并将它们映射到 UI 视图模型会引入过多的耦合,并且最终可能会更难维护。
  • “系统是否应该为 FE 侧的实体所做的每一次更改都进行一种乒乓球比赛”。每个必须处理的命令都必须发送到后端,是的。 DDD 最适合基于任务的 UI。

标签: c# angularjs domain-driven-design


【解决方案1】:

DDD 中没有任何东西可以阻止您将它作为任何类型 UI 的后端。几乎所有使用 DDD 构建的系统,其后端都有某种 UI。

特别是,阅读有关基于任务的 UI 和 REST API 的更多信息。根据用户执行的任务,您将需要从前端向您的域发送命令。您可以在前端进行初步验证,例如必填字段和数据类型,以及在您的域中进行业务验证和命令处理。所有的通信都是使用 REST API 与您的域完成的,这将是您的域和 UI 之间的适配器。

另外,后面带有 REST API 的 SPA 非常适合 CQRS。

不要在 FE 和 BE 之间交换您的实体。始终由您进行数据传输的 DTO。

【讨论】:

  • +1 用于 DTO...我错误地认为使用我的域实体中的 JSON 就足够了,但我在除了域问题之外的所有问题上都打了脸。
  • 让您的实体泄漏到域之外绝不是一个好主意,这是 UI 还是其他系统。
【解决方案2】:

您可能希望从域中生成前端。从您的域端描述生成客户端验证和计算。一旦它工作了,你就可以让你的生成器变得智能,因为它开始使用有关需要的乒乓球数量(甚至是实际延迟和吞吐量)的信息来进行缓存

【讨论】:

  • 感谢您的提示。我错误地考虑将我的域实体从我的前端移动到 AND (​​我的意思是,将域对象发送到 angular 并返回到后端的修改后的序列化版本......只是一个大混乱,显然可以工作不多)。我正在研究实现 CQRS 模式以避免这种错误,并且我正在慢慢理解(可能)应该如何做。
  • 我认为最好不要 DRY,而不是通过尝试从域中提取要在 UI 中使用的规则来引入大量耦合。
  • @plaix 我很确定 DRY 比手动复制和管理耦合更好,这是替代方法
  • @StephanEggermont 您是否真的尝试过使用诸如值对象之类的建模策略的丰富的始终有效的域?提取业务规则对于 CRUD 系统可能很容易,但在正确建模的 DDD 系统恕我直言中会非常困难。客户端上可能发生的大多数验证都是微不足道的,并且已经有很多框架可以让您有效地定义它们。如果就这么简单,没人会写这个,问题早就解决了。
  • 你可能想在这里阅读我的回答:stackoverflow.com/questions/28395176/… 和这篇文章gorodinski.com/blog/2012/05/19/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-10
  • 2010-11-23
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-14
相关资源
最近更新 更多