【问题标题】: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 的普遍问题。