Archive for May, 2006
In my previous post, I refactored CAB Smart Part Quick Start project to use Presentation Model. This time I refactored the project to use Model View Presenter. Note: the Presenter class is borrowed from Smart Client Software Factory, SC-SF.
Download: Source for PM, Source for MVP
They can be added to Smart Part QuickStart Solution for comparison.
The difference is that in MVP the presenter uses the interfaces to push data into the views. That presenter refers to views. In PM, views pull data from the presentation model. Views refer to pm via interface. The pm implements the interfaces. Personally,
I prefer PM to MVP. I successfully used the PM pattern in several projects.
My thougths are,
What esstentially MVP and PM do is to take the state and behavior of the presentation out of view. The views are dumb. They do nothing other than data binding and bypass user inputs.
But in MVP, although it splits one “autonomous View” into two parts, actually presenter and view are logically one thing, physically two class. When adding a new view, a new presenter is required.
In PM, it is a decoupled structure. Presentation model has no idea about view(s). It just holds the state and raise events. Adding new views needs no changes to the PM. View can also choose to connect different presentation model.
The Smart Client Software Factory recommand MVP over PM, “The rationale behind MVP as implemented in SC-SF is to encourage unit testing …” Read this thread.
So, I created two projects for the two patterns. Next I will try to unit tests for them to see.
May 19th, 2006
Composite UI Application Block (CAB) is really a powerful framework for smart client applications. It comes with samples implementing the Model View Control (MVC) pattern and the Model View Presenter (MVP) pattern. There is actually a third pattern called Presentation Model. See the pictures from http://jgoodies.com/articles/patterns-and-binding.pdf.
As described in Martin Fowler’s article (MVP, PM), the presenter in MVP has no state and the views need to provide interface allow presenter to manipulate them. The Presentation Model holds and synchronizes the state, but no need to create view interfaces.
Choice between MVP and PM, as per Martin Fowler’s article:
This decision would be strongly influenced by a decent framework that supports such synchronization. If you have such a thing then Presentation Model seems the better choice.
Compare to MVC or MVP, I prefer using the Presentation Model, because it has a centralized place to store state/data and centralized event source to notify views to update themselves. The CAB’s Event Broker is perfect for notification. So I modified the Smart Part Quick Start Project to become the ”Presentation Model” pattern. Here is the Source code.
What have I done?
- Refactor to extract interface ICustomerListView and ICustomerDetailView from the views*.
- Added CustomerPresentationModel class that implements the above two interfaces.
- Define the CustomerPresentationModel class as Service. **
- Inject the CustomerPresentationModel instances into views using service dependency injection. ***
- Published events CustomerSelected events CustomerCommentsSelected from the CustomerPresentationModel class.
- Subscribed the above events in BrowseCustomerWorkItem and ViewCustomerWorkItem
* Extract interface from the views sound very much similar to MVP, isn’t it? The difference is that in MVP, the presenter uses the interfaces to push data into the views, means that presenter refers to views. In PM, the controller implements the interface. The views pull data from the controller, means that views refer to controller. The “refer to” is a very good case of using depedency injection.
**
[Service]
public class CustomerPresentationModel: ICustomerDetailView, ICustomerListView
{
}
***
public partial class CustomerListView : TitledSmartPart
{
private ICustomerListView controller = null;
[ServiceDependency(Required = true, Type = typeof(CustomerPresentationModel))]
public ICustomerListView Controller
{
set { controller = value; }
}
….
}
Tags: smart client Composite UI Application Block MVC Model View Presenter Presentation Model injection
May 15th, 2006
继续 VSLive Toronto 的后续故事。 上次记录了 SQL/e,这次是关于 Daniel Cazzulino 的发言 《Microsoft p&p ObjectBuilder》。听完这个演讲发现最近周围的事情还都发生了些关联。
首先是日前买了本书 《Head Up Design Patterns》。它的第一章就以一个引人入胜的故事介绍了设计模式的 Strategy Pattern。这个模式的好处多多,但是负作用是会产生了很多相互关联的类。如何按照合理地创建这些类,并把它们组和起来。这就引出了另外一个话题 Inversion of Control / Dependency Injection。
这几天帮女儿复习准备乐理考试,还碰到了 Interval Inversion / Triad Inversion,搞得我就很头昏。Dependency Injection 好像还好理解些。
Daniel Cazzulino 讲的 ObjectBuilder 就是一个具有 dependency injection 功能的轻量级对象容器*。 ObjectBuilder 是 MS patterns & practices Composite UI Application Block 以及 Enterprise Library 的核心部分。
这就又引到了 CAB - Composite UI Application Block。也是不久前 WB Editor 3.0 的设计已经开始了。鉴于 2.0 版本中 RAD 流毒太深**,决定应该采用个好的系统结构,正在犹豫,是否用这篇 Implement a Microsoft Word-like Object Model for Your .NET Framework Application 文章介绍的方法呢,还是用 CAB。
经过聆听 Daniel Cazzulino 的讲解,不但了解了 OB 的功能,还了解了其内部的一些机制。因此决定进一步学习了一下 CAB Hands on Lab。于是得到结论就是 WB Editor 3.0 将采用 CAB。
Daniel Cazzulino 还讲了个有用的内容,Guidance Automation Toolkit / GAT,值得再用一篇笔记介绍。
* 轻量级对象容器和 ** RAD 流毒也可以讲些故事。
Tags: VSLive ObjectBuilder Strategy Pattern Inversion of Control Dependency Injection Composite UI Application Block CAB RAD
May 14th, 2006
During the WB Editor 2.5 testing, we found an interesting concurrency control issue. In this version, we allowed multiple program instance for ease of cross posting.
Now in multiple instance windows, user can setup blog server accounts differently. Which one is the winner?
“Last one wins” was disapproved by QA.
Maybe we need optimistic concurrency. I this case user will receive a dialog saying “another instance has modified the settings”, do you want to overwrite or discard or reload?
Another option is concurrency control with change notifications. Using FileSystemWatcher to detect changes of configuration file, but what should happen next in UI?
Tgas: WB Editor concurrency control Last one wins optimistic change notifications multiple instance blog cross posting FileSystemWatcher
May 10th, 2006
在 VSLive Toronto 上见到两个人物,Steve Lasker 和 Daniel Cazzulino
Steve Lasker 介绍了使用 SQL Server Everywhere 的 Occasionally Connected Systems。 SQL Server Everywhere(SQL/e) 何须人也?原来2-4年前做 Pocket PC 程序就相识,那时它叫 SQL Server CE,后来又叫 SQL Server Mobile。 Visual Studio 2005 带的 SQL Server Mobile 被限制只能运行在 Tablet PC 上。SQL/e 就是解除了这个限制的版本。SQL/e 因此能运行在台式 Windows 上。
SQL/e 计划在 2006年下半年发布。 Steve 演示了目前如何在 VS 2005 中试验开发的和可以通过 ClickOnce 安装的办法。
这就解决了一个版本 WB Editor 的数据库选择问题。 本来正在犹豫是否应该用 SQL Server 2005 Express (SQL/x)。这个家伙 55M,还需要 Admin 用户权限才能安装。 比较 SQL/x 和 SQL/e,SQL/e 才 1.4M。看来SQL/e 更加适合 WB Editor 3.0。
Daniel Cazzulino 讲的内容也很有用,将会在下一篇笔记内介绍。
May 8th, 2006