You work with a small software development team. When you started the project you're currently working on, an ASP.NET-based web application, eight months sounded like enough time for delivery. Your team decided to use ASP.NET MVC because everyone was comfortable developing in the .NET Framework. After seven months and a lot of jQuery, your team is not even close to delivering a quality code base. Furthermore, even if you could deliver all the features on time, your code has more than a few trouble spots that you would have liked to refactor, and code maintenance will be a challenge.
Does this scenario sound familiar? I had a similar experience on a project, which was my first and last project in ASP.NET MVC because I knew there had to be a better way to develop web applications. In my experience, the Model-View-ViewModel (MVVM) pattern provides that better way and is preferable to Model-View-Controller (MVC) pattern on which ASP.NET MVC is based. I have found that MVVM is easier to understand and implement than MVC and facilitates the development of simpler, more reusable code. Here I will provide an introduction to MVVM, first comparing the MVC and MVVM architectures and then giving an overview of some popular available frameworks that support an MVVM-based approach to web application development.
Architecture Is Important
In theory, the MVC pattern is a good idea. Views are responsible for displaying the data, controllers execute your business logic and manage the views, and models hide the complexities of dealing with a database. However, in practice, working with MVC can be problematic. Controllers will spawn many views, violating the single-responsibility principle, and your business logic will creep into all layers of your application, as Figure 1 illustrates. ASP.NET MVC makes it especially easy to make such mistakes, resulting in fundamentally flawed application architectures.
Writing C# code in your views also has performance and scalability implications. All data and HTML that you want to be displayed in the browser are compiled on the server. Rendering views on the server requires more resources, reducing the number of users that can be served concurrently on the server. The amount of data transferred to the client during application execution is inadvertently increased, which impacts bandwidth needs because with every request brand-new HTML could be generated, making caching strategies difficult to implement.
Silverlight Had the Right Idea
Silverlight—and more importantly, XAML—has been an interesting technology since its introduction. From a web development perspective, XAML encapsulated HTML5 and Cascading Style Sheets level 3 (CSS3) functionalities before any browser supported them. Data binding in Silverlight presents a clear break from event-based UI programming, and in Silverlight 5 with Async CTP, you get a break from callback-based asynchronous programming.
All these technologies allow for an effective MVVM implementation. ViewModels neatly encapsulate any presentation logic and allow for simpler View code by acting as a specialized version of the model, as shown in Figure 2. The relationship between a View and ViewModel is straightforward, allowing for more natural ways to wrap UI behavior in reusable user controls. Silverlight made me a believer in MVVM.
Under MVVM, the architecture inherently enforces the proper separation of concerns. Business logic is clearly separated from presentation logic. So when a View is developed, it stays developed, because fixing a bug in one View's functionality doesn't impact other views. On the flip side, if you've used visual inheritance effectively and created reusable user controls, fixing a bug in one place can fix issues throughout the application.
In an MVVM application, the client code lives on the client side, resulting a more responsive and rich user experience by default. During application execution, the amount of bandwidth required is reduced to a bare minimum, while enabling the app to gracefully handle semi-connected application states.
My experience with a development project for the National Oceanic and Atmospheric Agency (NOAA) illustrates why I've come to appreciate the MVVM pattern. This MVVM-based project had more than 50 views, and I was the sole application developer. The project was delivered with only minor delays, and about half of the code base was delivered as reusable code. Unlike some other projects I've been a part of, on this project the quality and reliability of the application consistently improved over time. Furthermore, I was able to gracefully address last-minute requirements changes.
The Web Is Ready
I still haven't addressed the elephant in the room. How will any of these technologies work with a Microsoft platform-based back end that you understand? We'll consider that question next.
Microsoft Is Ready, Too
At the Microsoft Build 2013 conference, I was pleasantly surprised to discover how much Microsoft has changed its stance on supporting standards-based web technologies. At last in Visual Studio 2013, Microsoft has provided a world-class HTML editor offering an amazing HTML5 code-development experience. I highly recommend that you set up Mads Kristensen's recently open-sourced Web Essentials plug-in and try coding some CSS with it.
Here are some additional tools that support back-end coding for an application using MVVM architecture.
- Web API 2 lets you easily write RESTful services and enable your apps to consume them. Web API 2 is straightforward to secure and also to debug.
- Entity Framework 6 lets you write a fully async back-end stack, which greatly improves the scalability of your solution.
Breeze effortlessly injects itself into the MVVM architecture, and if correctly abstracted, it is a technology that you don't need to be married to indefinitely. The data service layer on the client properly protects your front-end code from being specific to any back-end technology. Similarly, RESTful Web APIs can work with any front-end technology. However, it is still important to keep all business logic in the repository/service layer.
Get Started Today
An MVVM-based application architecture can be lean enough to enable you to build a web application quickly, while also flexible enough to scale and incorporate security features when those needs arise. I've presented some of the technologies I've found useful in creating MVVM application architectures. An additional tool that you might find useful is the ExcellaLean project, a boilerplate lean enterprise architecture that incorporates the previously discussed technologies and patterns and can help you jump-start your next web development project.