I break my MVC apps into several different projects.
- AppName.Configuration: to handle any configuration of the app (i.e. pulling in web.config/app settings, etc)
- AppName.Data: this is the data layer where all DB access is performed (no business logic). The DBML/EDMX lives here, my repository class(es) live here as well.
- AppName.Models: this is where all of my ViewModels are defined for MVC, as well as other model objects needed throughout the application.
- AppName.Services: This is my business layer, all everything must pass through here to get to the data layer or to the presentation layer. ViewModels are constructed from the database objects, data validation happens here, etc.
- AppName.Web: this would be the MVC application.
- AppName.Data.Test: Unit tests for Data app
- AppName.Services.Test: Unit tests for the services
- AppName.Web.Test: Unit tests for the MVC controllers
- AppName.Web.UI.Test: Unit tests for the web user interfaces (using WATIN)
I don't use any auto-mappers, as i clearly define a specific viewmodel for each view of the application. If it isn't needed for the view, it doesn't go in there.
Most MVC examples are so basic, they show everything in the web app (data, models, business logic in the controllers, etc.)
I hope this helps.