领域模型对视图模型的依赖有多糟糕?
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
我继承了一些仍在进行中的代码。我认为它有一个明显的架构问题:
它有一个包含所有域实体(域层)的项目和一个包含所有应用程序服务(应用层)的项目。应用层依赖于领域层。到目前为止,一切都很好。然后是第三个项目,其中包含应用层的所有视图模型。我将其称为视图模型层。很好
问题是,我已经意识到域层对视图模型层具有主动依赖性。它是什么,他们在这里为每个实体放置了一堆元数据,主要是各种字符串字段的最大长度,并且域实体和视图模型都引用这些常量值。
我很确定让域模型以这种方式依赖于视图模型是非常糟糕的。我发现这个是因为我想将域模型用于视图模型中的某些东西,但发现我不能这样做,因为它会导致循环引用。
所以我的问题是:这个架构有多糟糕?或者我真的错了,这根本不是问题。我实际上找不到答案,可能是因为它被认为太明显了。 此外,人们通常如何处理域实体和视图模型共有的字段元数据(如最大长度)?写在多个地方有点浪费
我将 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