【发布时间】:2016-09-02 23:29:20
【问题描述】:
我已阅读良好的设计模式可以解决以下相互冲突的要求:1.) 域模型 (DM) 不应依赖于其他层,例如 UI 和数据持久层。 2.) DM 需要与 UI 和数据持久层交互。什么模式可以解决这个冲突?
【问题讨论】:
标签: orm architecture domain-driven-design
我已阅读良好的设计模式可以解决以下相互冲突的要求:1.) 域模型 (DM) 不应依赖于其他层,例如 UI 和数据持久层。 2.) DM 需要与 UI 和数据持久层交互。什么模式可以解决这个冲突?
【问题讨论】:
标签: orm architecture domain-driven-design
这一切都归结为软件项目的用例。用例不指定项目中的任何类型的实现。只要满足这些特定的项目要求,您就可以为所欲为。
为了满足这些项目要求,有一些基本构建块是必需的。例如,如果没有要打印的实际数字,您就无法打印包含去年铅笔税的业务报告。无论如何,您都需要这些数据。
然后数据库成为下一个实施级别。数据库中的所有内容都是完成用例所需的基本构建块。没有它,您根本无法完成用例。
我们不希望我们的用户只拥有一个命令行 SQL 程序并通过它来完成所有用例,因为这将花费很长时间。想象一下,每个用户都必须了解和理解软件背后的域模型,只是为了弄清楚要读取什么值来确定标题屏幕的字体颜色。没有人会购买你的软件。
我们可能需要的不仅仅是一个简单的域模型来满足客户的用例。让我们构建一个程序,作为用户访问数据和更新数据的工具。我们可以简化执行此用例所需的知识和时间。例如,我们可以只制作一个加载屏幕的按钮。
虽然在我们看到的所有图表中,模型、视图和控制器都被视为彼此相邻,但它们实际上是相互堆叠的。您可以拥有一个没有视图或控制器的数据库,但反之则不行。要构建视图或控制器,您必须知道正在与之交互的内容。您仍然需要完成目标所需的基本数据(可以在数据库中找到)。
【讨论】:
我不确定您是否可以称其为设计模式,但我相信您正在寻找的是Dependency Inversion Principle (DIP)。
原则规定:
A.高级模块不应该依赖于低级模块。两个都 应该依赖于抽象。
B.抽象不应该依赖于细节。细节应该取决于 抽象。 - Wikipedia
当您将此原则应用于传统的分层架构时,您最终会得到广泛采用的Onion/Hexagonnal/Port & Adapters/etc...。架构。
例如,与传统的Presentation -> Application -> Domain -> Infrastructure 域依赖于基础架构细节不同,您可以反转依赖关系并使基础架构层依赖于域层中定义的接口。这允许域仅依赖于自身。
DM 需要与 UI 交互
关于这一点,我看不到域应该知道 UI 的任何场景。
【讨论】: