Upon reading this post by Martin Spedding, I got to thinking about where Microsoft Visual Studio fits into the scheme of things. Martin argues that Visual Studio leads developers down the seductive and misleading path of least resistance in application development. For instance he mentions that Visual Studio will place the app's public void Main() within the WinForm application's Form1. I agree that this is a particularly nasty practice and I agree with him that it is poor design, but that is in no way the fault of Visual Studio.
First and foremost, this practice begins to combine application startup code with the WinForm, which may (and arguably should be) completely independent of one another. This mentality hearkens back to the Visual Basic days in which the app's startup object could be a form vs. a Main() procedure. This can be pretty nasty because if you remove your form file to create a more appropriately named form (which I am very inclined to do), you lose your application's startup code.
Ok, that aside, I don't believe that it is the role of Visual Studio to enforce a layering separation in our code. Visual Studio is an editor. It's an IDE. It offers functionality as defined and prescribed in the language engines (such as syntax coloring, intellisense, and much more). It's an immersive experience to work in Visual Studio because it brings so much together, but it shouldn't be telling me how to write my code. When it comes down to it, the problem with the aforementioned non-separation of code isn't the fault of Visual Studio at all...it's all in the template files that it uses to create a new project. If anything those should be fixed.
I firmly believe that the layering approach to application development is the right way to design and develop applications for a lot of reasons. Developers should be taught and nurtured with best practices, but that's not the responsibility of the IDE...fix the templates.
If anyone is interested, I've updated all of the scripts, html files, and template .cs files that VS uses that helps promote best practices and eliminates unnecessary dependencies (such as System.Data and System.Xml which I don't use unless I need to). Saves a few clicks whenever I start a new project. Just let me know!