【问题标题】:How should nested components interact with model in a GUI application?嵌套组件应该如何与 GUI 应用程序中的模型交互?
【发布时间】:2010-06-15 21:25:17
【问题描述】:

广泛的设计/架构问题。如果您在 GUI 中有嵌套组件,这些组件与数据交互的最常见方式是什么?

例如,假设一个组件接收到对其某个按钮的点击以保存数据。是否应该将保存请求委托给该组件的祖先,而最上面的祖先最终将请求传递给控制器​​?

或者 GUI 应用程序中的模型/数据存储通常是单例的,以便层次结构中任何级别的组件都可以直接获取/设置数据?

或者是控制器作为依赖注入到组件的层次结构中,因此任何给定的组件与数据存储/模型只有一个中介?

【问题讨论】:

    标签: model-view-controller user-interface design-patterns oop


    【解决方案1】:

    我的第一个想法是定义一个可由 GUI 组件调用的单例数据层 API。

    如果您想要数据的多个实例,则给出“句柄”,可以由 GUI 组件存储,并传递给数据层以再次获取数据。

    这个想法类似于,例如文件系统API;或 SQL 服务器 API;或任何 O/S API。

    【讨论】:

      【解决方案2】:

      一般来说,使用嵌套组件操作的可能选项很少:

      • 嵌套组件使用与根组件相同的模型/嵌套组件使用自己的模型。

      • 嵌套组件与根组件使用相同的控制器/嵌套组件使用自己的控制器进行操作。

      没有一个正确的答案,使用什么选项。当然,使用同一个模型和同一个控制器是最简单的方法,但如果嵌套组件包含复杂的 UI 逻辑,最好将模型或/和控制器分开。

      另外,您使用什么语言?什么平台?在不同的编程环境中,不同的实现会更好。如果使用平台支持面向对象的基于组件的GUI模型,则可以将嵌套控件封装到用户控件中,得到可复用的封装易用组件。

      我认为对模型/控制器使用单例是个坏主意,尤其是您使用带有垃圾收集器的语言。使用单例很简单,但是如果您需要根视图上的第二个嵌套控件实例怎么办?

      【讨论】:

        【解决方案3】:

        我同意上述 STO:

        • 将数据推送到与父视图的 C/VM 共享的底层控制器/视图模型是我在大多数应用程序中所做的。
        • 单例是个坏主意!如果你认为你需要一个单例,你可以通过调用一个缓存实例的工厂来获得相同的结果。例如。 factory.GetAcountViewModel();
        • 一般来说,我不会将处理委托给父级。这降低了代码的可测试性,因为现在您正在通过 UI 层传递数据和状态。

        仅供参考: 如果您想阅读更多内容,您可能还想查看http://compositewpf.codeplex.com,它解决了可组合 UI 的普遍问题。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-18
          • 2021-01-29
          • 1970-01-01
          • 1970-01-01
          • 2010-12-13
          • 1970-01-01
          相关资源
          最近更新 更多