领域模型对视图模型的依赖有多糟糕?

How bad is it for Domain Models to have a dependency on View Models?

我继承了一些仍在进行中的代码。我认为它有一个明显的架构问题:

它有一个包含所有域实体(域层)的项目和一个包含所有应用程序服务(应用层)的项目。应用层依赖于领域层。到目前为止,一切都很好。然后是第三个项目,其中包含应用层的所有视图模型。我将其称为视图模型层。很好

问题是,我已经意识到域层对视图模型层具有主动依赖性。它是什么,他们在这里为每个实体放置了一堆元数据,主要是各种字符串字段的最大长度,并且域实体和视图模型都引用这些常量值。

我很确定让域模型以这种方式依赖于视图模型是非常糟糕的。我发现这个是因为我想将域模型用于视图模型中的某些东西,但发现我不能这样做,因为它会导致循环引用。

所以我的问题是:这个架构有多糟糕?或者我真的错了,这根本不是问题。我实际上找不到答案,可能是因为它被认为太明显了。 此外,人们通常如何处理域实体和视图模型共有的字段元数据(如最大长度)?写在多个地方有点浪费

我将 c# MVC 与 angular 客户端一起使用,物有所值。

提前致谢。

Clean Architecture push us to separate stable business rules (higher-level abstractions) from volatile technical details (lower-level details), defining clear boundaries. The main building block is the Dependency Rule: source code dependencies must point only inward, toward higher-level modules. Higher level modules shouldn't depend on the lower level modules.

您的域模型不应依赖于视图模型。它打破了 Robert C. Martin 提出的最重要的清洁架构规则。

how bad is this architecture?

它和它产生的问题一样糟糕。您已经指出的第一个 - 您不能在 View Models 模块中引用 Domain Models 模块。领域模型已经足够复杂了,因为它解决了领域问题。您不应通过引用细节(如视图模型)来增加额外的复杂性。我能想到的另一个问题是,你的依赖越多,你的领域模型就越难测试。

Also, what do people normally do for field meta-data (like max length) which is common to both the domain entities and the view models? Seems a waste to write it out in more than one place.

验证规则可以有不同的来源,例如:

  • 技术数据库限制
  • 商业规则
  • GUI 友好性
  • 其他?

您应该考虑您拥有的每个验证规则,并确定它的来源。如果验证规则在业务规则方面有意义,我会把它放在域模型中。也许有些验证规则不应该出现在您的域模型中?希望对你有点帮助:).

也看看这篇文章:Data validation