干净的架构:预置器可以与控制器通信吗?

clean architecture : can the preseter talk to to the controller?

在清晰的架构中,bob 叔叔的建议。

关于如何正确分配责任,我有很多疑问

控制器和演示器之间似乎没有关系。 控制器的工作是获取输入并触发用例,演示者的工作是获取用例提供的输出数据并将其显示在视图上。

这里的视图似乎是一个非常愚蠢的对象,它的唯一功能是向 UI 显示数据,这在控制器仅由外部代理调用的情况下才有意义。

但是在网络的情况下如何访问控制器?。用户与视图交互,因此视图应该包含控制器的实例和足够的智能来调用控制器的正确方法。 在这种情况下,视图。不是真正的哑对象它具有如何调用控制器的智能,

或者调用控制器是演示者的工作?取决于 Contax,然后最终调用视图来显示数据。

或者控制器与视图紧密结合?这样所有的智能都只存在于控制器中,视图传输原始事件和数据。但是这样做controller会对view了解太多,会依赖于view。

还有一个问题,假设在调用用例后,u 已经成功,但 UI 需要更多数据来显示结果为 UI.

那么获取更多数据的逻辑在哪里?

  1. 是不是在view以后用例成功了用例会侵入presenter,presenter会发msg给view,然后view会请求更多的数据从控制器到显示器?

  2. 是在Presenter吗?因此,在用例成功并显示成功消息之后。然后演示者将调用控制器以获取要显示的附加数据并将其传递给视图。

  3. 是在controller吗?在从用例获得成功 return 响应后,控制器将再次调用另一个用例,该用例将通过演示者向视图显示附加数据。

  4. 是在use case吗?用例本身将决定发送额外的数据以显示给用户,但是,我不相信这一点,因为不应该由用例来考虑显示哪些数据,它将绑定用例到一种类型的演示文稿,因为相同的演示文稿可能不是真正的演示文稿,例如,CLI 可能不需要额外的数据。

还有谁真正创建了controller和presenter,是main函数创建了每一个presenter和controller,还是高层的controller创建了低层的controller和presenter并传递给presenter?

but how the controller is accessed in the case of the web?. the user interacts with the view so the view should hold the instance of the controller and enough intelligence to invoke the correct methods of the controller. in this case, the view. is not really a dumb object it has the intelligence to how to invoke the controller,

术语控制器高度超载。如果是 Web 应用程序,您有 2 种控制器。

  • 与视图
  • 连接的ui控制器
  • a rest controller 或更一般的 remote controller 由 http 请求调用并执行用例。

两个控制器都可以有演示者。一个负责将用例的响应模型转换为用于传输的其余表示,另一个负责将 http 响应转换为 ui 模型。

                                         http request
  +------+   event   +---------------+   ------------>  +-----------------+     +-------------+
  | View |  -------> | ui controller |                  | rest controller | --> | input port  |
  +------+           +---------------+   <------------  +-----------------+     +-------------+
     |                      |            http response           |          
     |                      |                                    |
     V                      V                                    V
  +----------+ update +---------------+                 +-----------------+     +-------------+
  |   model  | <----- | ui presenter  |                 | rest presenter  | <-- | output port |
  +----------+        +---------------+                 +-----------------+     +-------------+

or it's the job of the presenter to invoke the controller? depending upon the Contex and then finally invoke the view to display the data.

不,控制器使用演示器。它实例化一个演示者并将其传递到输入端口。在富客户端应用程序中,演示者将更新 Web 应用程序中的 ui 模型,你有两个演示者,因为你必须处理如上所示的跨线路传输。

or the controller is closely bonded to the view? so that all the intelligence exists in the controller only and the view transfers the raw event and data. But doing so the controller will know too much about the view and will be dependent on the view.

您通常将事件侦听器与视图的控制器部分分开以解耦它们。

+------+   event   +----------------+  implements  +---------------+  call +------------+
| view |  -------> | event listener | <----------- | event handler | ----> | controller |
+------+           +----------------+              +---------------+       +------------+

你也经常看到controller是一个事件监听器,实现了事件处理器部分

one more question, say suppose after invoking the use case, u which was success full but the UI want some more data to display the result to the UI.

so where does the logic of fetching more data reside?

通常用例应该提供用户界面需要的所有数据。如果用户界面需要调用另一个用例,您可以在 ui 中集成用例。这也意味着您没有一个应用程序 api。当使用微服务架构时,经常会发生这种情况。

所以当你需要在 ui 端集成时,我会让 ui 控制器发出事件(而不是 ui 事件),以便其他 ui 控制器可以听他们的。对于 ui 控制器,触发事件是从视图还是从其他控制器发出并不重要。因此,我还将为此实现一个事件处理程序。


编辑

i didn't get the If the user interface needs to call another use case you integrate use cases in the ui. This also means that you don't have one application api could you please provide little bit more context/ex.

假设您有一个客户可以下订单的应用程序。未注册的客户也可以在下订单时创建一个帐户,以便客户稍后可以登录查看所有已下的订单。

如果您有专用应用程序 api,则 ui 仅与为其目的而创建的一项服务对话,并且该服务(应用程序 api )集成了其他服务。在这种情况下,ui 只会对其应用 api 进行一次 api 调用。此调用包括订单和可能的注册信息。通话结束后下订单并注册用户。

                                        +--------------+
                                  +---> | user service |
                                  |     +--------------+
+--------+         +---------+  --+  
|   ui   |  ---->  | app api |  
+--------+         +---------+  --+
                                  |     +---------------+
                                  +---> | order service |
                                        +---------------+

另一方面,您也可以在 ui 端集成。在这种情况下,ui 首先调用订单服务下订单,然后调用用户服务注册新用户,反之亦然。

                     +--------------+
               +---> | user service |
               |     +--------------+
+--------+   --+  
|   ui   |  
+--------+   --+
               |     +---------------+
               +---> | order service |
                     +---------------+

这两种场景都可以应用于单体或微服务架构。

关于这两种情况的优缺点还有很多要讨论的。但我必须到此为止,因为这将远远超出您的问题范围。