Archive for February 2008
I used to think controller in MVC is to separate the view and the model, until I saw this blog An Introduction to the Model-View-Controller, Model-View-Presenter, and Presentation-Abstraction-Control Patterns where Derek Greer wrote,
One common misconception about the relationship between the MVC components is that the purpose of the Controller is to separate the View from the Model. While the MVC pattern does decouple the applicationâ€™s domain layer from its presentation layer, this is achieved through the Observer Pattern, not through the Controller. The Controllerâ€™s job is to mediate between the human and the application, not between the View and the Model.
While the original idea of the Presenter was seen by the Taligent team as a Controller elevated to an application level, the Dolphin team mistakenly considered it a replacement of the VisualWorksâ€™ Application Model and maintained the Presenter as a mediating component within the triad.
- In MVC, controller is the human to model connector (intercepts user input).
- In Taligent MVP, the presenter is the subsystem component connector (manages application subsystems).
- In Dolphin MVP, the presenter is the presentation to domain connector (manages access to model updates).
- In Passive View, the presenter manages presentation logic.
- In Supervising Controller, the presenter assists with presentation logic.
The code beside technology is used by the visual studio designer. E.g. for each Windows Form, visual studio designer generates two partial classes, one for creating UI elements, and the other one is the place to write code. I think it is a MVP/Passive View already.
- Windows Froms App, The SomeForm.designer.cs is the view and the SomeForm.cs is the presenter.
- ASP.NET, the aspx/ascx is the view and the aspx.cs/ascx.cs is the presenter.
- WPF, the xmal is the view and the xmal.cs is the presenter.
If it Visual Studio generates an interface, ISomeForm.cs. Then have SomeForm.cs reference to this interface, instead of being partial class of the view. It is exactly MVP/Passive View. This would make unit testing easy based on ISomeForm.cs and SomeForm.cs. I would not mind if Visual Studio does this (in fact it might be something good to suggest MS to do).
In SCSF and WCSF, there has to be another presenter class. This makes me feel it is a redundant, because presenter class ties/couples to the view. It can hardly be reused. And you have to create extra code to delegate user input/UI events to the presenter. That’s part of reasons why I am not satisfied w/ MVP in SCSF and WCSF.
The original force of MVP is to ease unit testing. Current unit testing on the presenter is to mock interfaces of view and model. Because there is no other better method, this leaves the mocking on interfaces only one to use practically.
What about to have a tool that generates mock object from aspx/ascx to make aspx.cs/ascx.cs unit test-able?
ASP.NET framework is already a MVC framework that allows to implement MVC.
Within ASP.NET, there is a front controller.
The controller itself is usually implemented in two parts: a handler and a hierarchy of commands. The handler has two responsibilities:
Retrieve parameters. The handler receives the HTTP Post or Get request from the Web server and retrieves relevant parameters from the request.
Select commands. The handler uses the parameters from the request first to choose the correct command and then to transfers control to the command for processing.
The commands themselves are also part of the controller. The commands represent the specific actions as described in the Command pattern [Gamma95]. Representing commands as individual objects allows the controller to interact with all commands in a generic way, as opposed to invoking specific methods on a common command class. After the command object completes the action, the command chooses which view to use to render the page.
The upcoming ASP.NET MVC framework is another front controller implementation.
ASP.NET’s default front controller truns plain http request into view state and server side events. ASP.NET AJAX extended the ASP.NET web form to support partial page render.
ASP.NET MVC replaced (not extended) the default front controller, so that there won’t be view state, nor server side event any more, in order to have SEO/REST style URL. Not sure if it is worth to trade REST style URL with view state, server side events and partial page render.
I have uploaded two articles to codeproject.com.
In the second article, because I wanted it to be focused on Presentation Model itself, one peice omitted which is using SharePoint Designer 2007 to create a new aspx page.
To do so, the code needs to be in aspx and created the file, web.config needs to be modified to allow compilation on the page.
<pageparserpath VirtualPath= “/Customer4.aspx” CompilationMode=”Always” AllowServerSideScript=”True” AllowUnsafeControls=”True” />