My current client is looking to combine a series of line of business Access (YIKES) and Win Forms apps into a composite WPF MVVM solution. I was also brought in to architect one of the heavy hitter apps that will be a part of the new composite application. In the initial discussion concerning creating a composite application, one of the client’s developers presented a proof of concept composite application using Microsoft’s Prism. I voiced my concern about the amount of code said solution would be required to handle and recommended going with a multi-solution composite rather than a multi-project composite.
I started researching multi-solution composite applications on the inter-webs and found very little, virtually no, useful material…and this worried me. I couldn’t be the first guy to think the multi-solution approach would be preferred for a composite application that will, when all is said and done, contain hundreds of thousands of lines of code. Not wanting to lead my client in the direction of the proverbial unicorn I decided to put together a little proof of concept of my own.
This code is a Proof Of Concept and was developed as such. The overall functionality of the application is trivial. It is UI centric and does not contain a true data access layer and it does not contain any unit tests. I know this is horrible but please understand. :)
The typical WPF composite application is broken down into three major sections.
- Infrastructure (VS Project)
- Domain Entities
- Shell (VS Project)
- WPF Window that will act as the *shell* of your composite application
- Bootstrapper (we will discuss this later)
- Modules (1 or more VS Projects)
- WPF user controls that make up the functionality of your application
- Modules should be as self contained as possible with minimal references to Infrastructure
- Each module will contain
- View Model
- Controller (optional)
The structure for a multi-solution composite application is similar but is broken out into solutions instead of projects, surprise!
The code is really straightforward. There a couple of requirements though:
I included some UI enhancements, including implementing the Avalon Dock controls for docking windows.