background image

NET 平台上的 Model-View-Presenter 模式实践

为什么要写这篇文章

      笔者当前正在负责研究所中一个项目,这个项目基于.NET 平台,初步拟采用 C/S 部

署体系,所以选择了 Windows Forms 作为其 UI。经过几此迭代,我们发现了一个问题:

虽然业务逻辑已经封装到 Services 层中,但诸多的 UI 逻辑仍然弥漫在各个事件

Listener 中,使得 UI 显得臃肿不堪,并且存在诸多重复性代码。另外,需求提供方说,

根据实际需要,不排除将部署结构改为 B/S 的可能性,甚至可能会要求此系统同时支持

C/S 和 B/S 两种部署方式。那么,如果保持目前将 UI 逻辑编码到 Windows Forms 中的

方式,到时这些 UI 逻辑将无法复用,修改部署方式的代价很大。

      为了解决以上两个问题,笔者和相关人员商量后,决定引入既有成熟模式,重新设

计表示层的架构方式,并重构既有代码。

      提到表示层(Presentation Layer)的模式,我想大家脑海中第一个闪过的很可能

是经典的 MVC(Model-View-Controller)。我最初也准备使用 MVC,但经过分析和实

验后,我发现 MVC 并不适合目前的情况,因为 MVC 的结构相对复杂,Model 和 View

之间要实现一个 Observer 模式,并实现双向通信。这样重构起来 Services 层也必须修

改。我并不想修改 Services 层,而且我想将 View 和 Model 彻底隔离,因为我个人并不

喜欢 View 和 Model 直接通信的架构方式。最终,我选择了 MVP(Model-View-

Presenter)模式。

      经过两天的重构和验证,目前已经将 MVP 正式引入项目的表示层,并且解决了上文

提到的两个问题。在这期间,积累了少许关于在.NET 平台上实践 MVP 的经验,在这里汇

集成此文,和朋友们共享。

UI 与 P Logic