Not long ago Microsoft introduced their
Model-View-Controller framework under ASP.NET MVC name. It provides a toolset
for building well-designed testable 3-tier applications, which follow the Model-View-Controller
pattern. However, MVC is not the only one architectural solution for
constructing 3-tier applications. Another well known approach is the
Model-View-Presenter pattern (abbreviated as "MVP"). MVP pattern
appeared about 10 years after MVC originated. It was designed to be an
evolution of MVC and to eliminate the drawbacks of the latter. And indeed,
Model-View-Presenter has a number of advantages over MVC, which make MVP a more
favorable choice than MVC for many applications.
In this article we are concerning a new Model-View-Presenter
framework under .NET platform named MVC#. The article is based on the
classic ASP.NET MVC example application by Scott Guthrie (described here: part
But here we are going to re-implement this example with the use of MVC#
Framework, showing the strong points of MVC# (and MVP pattern overall) over
A Simple Store Application
The ASP.NET MVC application we are going to rework consists of
several views. We will deal with four of them: "Welcome" view,
"Product Categories" view, "Products" view - to list
products within a specific category, and "Edit Product" view to
show/edit details for a chosen product.
If a user clicks on some category in the categories list he
should be navigated to the products view for that category. If he clicks
"Edit" against some product in the products view then the "Edit
Product" view should be opened for that product. Finally, a user should be
able to modify the product details (in the "Edit Product" view) and
commit changes by clicking the "Save" button.
The Model is first
Model is the core of every application. It contains
definitions for the application domain concepts, which the rest of the application
relies on. That is why the applications' design is often started with
constructing the model.
As for implementing the Model tier, several approaches are
applicable here. A developer may use the conventional .NET 2.0 datasets, or
more object-oriented brand new Linq + Entity Framework toolset, or third-party
tools such as NHibernate or CapableObjects ECO. Anyway, neither ASP.NET MVC nor
MVC# restrict developers in choosing the Model layer implementation technique.
Our example model will include three domain concepts:
Categories, Suppliers and Products. The relationships between these concepts
are quite simple: each product belongs to some category and some supplier. For
maximum capability we will use typed datasets to implement the Model tier. So
this is how our model will look in Visual Studio dataset designer:
To provide a uniform access to the Model objects we will
also apply the Singleton pattern to the dataset class. As a result we will
easily access domain objects through the NorthwindDataSet.Instance object.