1

我一直在尝试从博客、文章和视频中了解更多关于 Bob 叔叔的清洁架构的信息。

如果我要在这个架构中使用数据库,那么 UI(作为 Web 或表单等框架)应该了解数据库的哪些信息?或者更一般地说,数据应该如何在同一层中的两个或多个片段/部分之间流动?

例如,UI 将与我的适配器/网关对话以与业务实体交互。对于读/写,我可以看到 UI 可以调用任何可以访问数据库并传入适配器/网关的类/类,以便它可以与业务实体交互。

    public class SomeUI
    {
        public static void Main(string[] args)
        {
            SomeAdapter adapter = new SomeAdapter();
            SomeDataAccess db = new SomeDataAccess();
            db.Save(adapter);
        }
    }

    public class SomeDataAccess
    {
        public void Save(SomeAdapter adapter)
        {
            //Interact with database
        }
    }

    public class SomeAdapter
    {
        //properties
    }

许多文章与这篇文章几乎没有什么不同(https://subvisual.co/blog/posts/20-clean-architecture)。我还没有找到一篇很好的文章来介绍同一层中的各个部分应该如何相互协作。因此,提及该问题的文章将是一个可以接受的答案。

这似乎没有违反依赖规则,但感觉就像我做的不对,因为我在我的 UI 和数据库之间建立了依赖关系。我相信我可能过度思考了这个概念,并且我相信这可能来自于学习三层架构(UI -> BLL -> DAL)。

4

2 回答 2

2

你问:

如果我要在这个架构中使用数据库,那么 UI(作为 Web 或表单等框架)应该了解数据库的哪些信息?或者更一般地说,数据应该如何在同一层中的两个或多个片段/部分之间流动?

Clean Architecture中没有UI 组件这样的术语。在Clean Architecture术语中,UI将是表示层交付机制,分解为以下组件:

  • 视图模型生成器(或使用 Bob 叔叔的术语的演示),负责封装 UI 的业务规则。这应该访问业务模型以便从中生成视图模型。业务模型由其调用者交互器传递给交互器响应对象演示方法。
  • 保存视图数据并通过例如事件间接传递给视图视图模型。
  • 现在与域模型和所有层分离的哑视图显示视图模型的数据。

以这种方式分解可确保更好的可测试性、更好的 SRP 以及与应用程序、域和基础架构层的更多解耦。

所以你的表示层应该对基础设施层一无所知。


也许您对使用某种Web 表单组件/库的示例感到困惑?这种组件提出了相互关联的功能,每个功能都与几个架构层相关:领域、应用程序和表示……因此,Web 表单组件特别适合在清洁架构中令人满意地适应。由于这种不灵活性,我仍在努力找出将Web 表单组件集成到我的Clean Architecture实现中的最佳方法......


最后,为了清楚起见,你说:

例如,UI 将与我的适配器/网关对话以与业务实体交互。对于读/写,我可以看到 UI 可以调用任何可以访问数据库并传入适配器/网关的类/类,以便它可以与业务实体交互。

与您的实体交互不是UI的责任,但顾名思义,它是交互者的责任(交互者=用例)。交互器旨在封装应用程序业务规则,它们代表应用程序层。他们可以通过实体网关CRUD 您的实体,实体网关是您到基础设施层的适配器,可以是 ORM、REST API 或其他...


编辑#1

因为这里有一千字的图片是 Bob 大叔的 UML 类图,它代表了Clean Architecture的结构(以及相关组件之间的数据流) :

在此处输入图像描述


编辑#2

在我看来,您在清洁架构中对控制流的表示有点颠倒了。参考上图和 Bob 大叔的类比:

如果您不希望您的代码依赖于某个事物,请将此事物设为插件

(另外说,让那个东西成为你想要独立于它的代码的客户端。)

Clean Architecture中,您希望表示层,或者更具体地讲,交付机制( Controller++ Presenter)成为业务层(由通信通道边界右侧的组件组成ViewModel的插件。View

于 2018-11-03T15:29:12.950 回答
1

我一直在对干净架构的其他示例进行更多研究。

架构设计来源)。

从上图中,看起来 App(业务实体和用例)与 Delivery(Externals:UI)来回对话。Delivery 用于与外部(外部:DAL)交谈。

交付是您实现应用程序本身的交付机制的地方。交付是您的应用程序与外部数据源集成并显示给用户的地方。这意味着最简单的 UI,但也意味着创建外部对象的具体版本,例如数据插孔,以及调用应用程序本身的操作。-复古摩卡

所以,这让我相信是的,顶部的代码示例是有效的,但我仍然愿意听取其他人是否有更多的答案可以提供。

于 2017-01-11T17:13:32.390 回答