2015-02-11 65 views
0

这更多的是设计模式问题,所以不会有代码和大量的词汇,请耐心等待。我正在编写一个商业应用程序(使用WinForms在C#中)。有一个POCO风格的对象代表用户当前正在处理的一组数据 - 一个包含所有相关数据的“文档”。应用程序设计:如何让GUI响应数据的变化

业务操作是在应用层中的一组管理器中实现的,每个管理器负责其应用程序的各个方面。 其中一个方面是重新计算在对象数据中持续存在的某些摘要。经理们知道哪些数据操作可能需要重新计算并在适当的时候调用它们。

GUI(WinForms)部分负责将用户的交互转换为对应用程序层的调用。比方说,你点击Add按钮,click事件找到ObjectListManager类并调用manager.AddObject(...)。由于ObjectListManager知道这需要更新摘要,所以它确保重新计算它(通过在内部调用其他管理器)。

我想知道的是这个。我需要我的GUI来刷新表格上的摘要。我的第一个冲动是建立一个委托占位符(where ?!),注册一个GUI级别的方法作为该回调的委托,并让这个方法由应用层调用。但我不确定这与抽象的业务操作并不矛盾,我希望维持他们对GUI层的不可知性。另一方面,另一种方法是将其构建到GUI级别的用户交互响应中,即点击Add按钮应该知道在调用manager.AddObject()之后,它应该查询重新计算的数据并将其呈现在GUI中。

我缺乏一些经验/知识,无法弄清楚如何正确设计。 答案的长版本可能是读完“四人帮”的书,但如果现在有人能够提出好的实用建议,那将非常感激。

+0

有已经为此模式:Model-View-ViewModel(MVVM)。如果你可以使用WPF,它*已经设置好使用它。 – BradleyDotNET 2015-02-11 23:18:16

+0

为了扩展BradleyDotNET所说的内容:WPF包含一个所谓的“数据绑定”系统。 GUI元素可以被赋予一个对象来观察。他们将从该对象中读取特定属性,并在该对象引发特定事件(属性更改,集合更改)时自动刷新。您的GUI显然需要知道它显示的内容,而不是其他方式 - 底层对象不需要知道对他们的事件作出什么反应。你可以交换或删除GUI,其余的代码仍然可以工作。 – 2015-02-11 23:35:24

+0

Pieter,绝对,是的 - GUI应该知道它正在播放的对象,但业务对象应该可以在另一个表示层重用 - 这就是目标。不幸的是,切换到WPF目前不是一种选择。此外,我怀疑“观察对象”会带来开销。在我的情况下,接触点很少..所以我坐在这里想知道如何以这种精神建立一些东西,但在前端以低廉的价格提供普通的旧式winforms。 – 2015-02-11 23:52:48

回答

1

这里阅读M.Fowler的文章后:http://martinfowler.com/eaaDev/SeparatedPresentation.html

,并在这里实现Observer模式 http://www.codeproject.com/Tips/769084/Observer-Pattern-Csharp 这里 http://www.codeproject.com/Articles/88278/Observer-in-NET-with-IObserver-T

几个文本的最终我实现具有简单的观察者模式我数据模型作为主题(在基类中实现)和形式为观察者。

为了我个人的口味,它像是使得数据对象不是POCO有点超过我希望它是,但嘿,如果它是Martin Fowler的不够好......