【问题标题】:How can a Domain Model interact with UI and Data without being dependent on them?领域模型如何在不依赖于 UI 和数据的情况下与它们进行交互?
【发布时间】:2016-09-02 23:29:20
【问题描述】:

我已阅读良好的设计模式可以解决以下相互冲突的要求:1.) 域模型 (DM) 不应依赖于其他层,例如 UI 和数据持久层。 2.) DM 需要与 UI 和数据持久层交互。什么模式可以解决这个冲突?

【问题讨论】:

    标签: orm architecture domain-driven-design


    【解决方案1】:

    这一切都归结为软件项目的用例。用例不指定项目中的任何类型的实现。只要满足这些特定的项目要求,您就可以为所欲为。

    为了满足这些项目要求,有一些基本构建块是必需的。例如,如果没有要打印的实际数字,您就无法打印包含去年铅笔税的业务报告。无论如何,您都需要这些数据。

    然后数据库成为下一个实施级别。数据库中的所有内容都是完成用例所需的基本构建块。没有它,您根本无法完成用例。

    我们不希望我们的用户只拥有一个命令行 SQL 程序并通过它来完成所有用例,因为这将花费很长时间。想象一下,每个用户都必须了解和理解软件背后的域模型,只是为了弄清楚要读取什么值来确定标题屏幕的字体颜色。没有人会购买你的软件。

    我们可能需要的不仅仅是一个简单的域模型来满足客户的用例。让我们构建一个程序,作为用户访问数据和更新数据的工具。我们可以简化执行此用例所需的知识和时间。例如,我们可以只制作一个加载屏幕的按钮。

    虽然在我们看到的所有图表中,模型、视图和控制器都被视为彼此相邻,但它们实际上是相互堆叠的。您可以拥有一个没有视图或控制器的数据库,但反之则不行。要构建视图或控制器,您必须知道正在与之交互的内容。您仍然需要完成目标所需的基本数据(可以在数据库中找到)。

    【讨论】:

    • 现在,让我也这么说吧.. 您可能需要在数据库中存储信息以帮助您呈现信息(标题、说明等)。但是,这些信息随后会成为您的用例所需的“关键信息”的一部分(即,要求表明“必须以有意义的、用户友好的方式进行交互),因此成为领域模型的基础。
    • 您的具体问题是什么?是否存在您似乎无法使域模型独立的特殊情况?
    【解决方案2】:

    我不确定您是否可以称其为设计模式,但我相信您正在寻找的是Dependency Inversion Principle (DIP)

    原则规定:

    A.高级模块不应该依赖于低级模块。两个都 应该依赖于抽象。

    B.抽象不应该依赖于细节。细节应该取决于 抽象。 - Wikipedia

    当您将此原则应用于传统的分层架构时,您最终会得到广泛采用的Onion/Hexagonnal/Port & Adapters/etc...。架构。

    例如,与传统的Presentation -> Application -> Domain -> Infrastructure 域依赖于基础架构细节不同,您可以反转依赖关系并使基础架构层依赖于域层中定义的接口。这允许域仅依赖于自身。

    DM 需要与 UI 交互

    关于这一点,我看不到域应该知道 UI 的任何场景。

    【讨论】:

    • 谢谢 plalx。命名该模式 (DIP) 很有帮助。我还不能投票给你的答案,但是当我可以的时候,我会回来投票。
    猜你喜欢
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多