Building a modern application in .NET
Recently I was fortunate enough to be in the position of having a completely free hand to choose the technologies for a desktop application, which is a double edged sword. The only technical brief was that it had to be a Windows Desktop application
So, where to start. Firstly, and quickly, I ruled out MFC and C++ Builder / Delphi (in a turnaround from 5 years ago where it would have definitely been C++Builder).
It had to be either .NET or Java, and given that the target platform was Windows, and only ever going to be Windows¹ it had to be .NET. The reason for .NET is based on the experience of building a complex Java application (see Java Avionics Training Platform). Java is great at what it does, but it is never long before stumbling across something that can't be done because Java is one small step too far away from Windows.
That meant it had to be C# .NET.
So it was either WinForms or WPF, which took a lot of research and quick prototypes before deciding that WPF was the only really viable possibility given the choice of building something new.
That meant it had to be WPF, C# .NET
Now all I had to do was to figure out how to implement the DataModel. I'm a big fan of ADO.NET as it's easy to fit direct into a data layer, but whilst looking into WPF I discovered The Entity Framework In Layered Architectures and rapidly came to the conclusion that the Entity Framework sat better between the database and WCF/WPF and it felt better and there was a lot less glue to write.
That meant it had to be EF, WPF, C# .NET
Having now built most of the application (DB->EF->WPF desktop application) I'm still happy that I went with the EF & WPF. The EF does most of the grunt work for me and I think it maps really well between relational and object oriented. It's also been a joy extending the model and having a datamodel which features a hierarchical data structure that is easy to traverse when compared to the difficulties of doing this in SQL.
This process proves that it is still important to validate of all requirements before committing to any architecture. I built a few simple proof of concept applications that were used to validate that my requirements could be met.
¹ - Until enough demand arrives for other platforms.