I currently have an application which suffers from Fat Controllers. I am trying to pull out the business logic into a service layer and am hoping to clarify my approach.
For raising Model errors I had planned on using an approach like described here: http://www.asp.net/mvc/tutorials/older-versions/models-%28data%29/validating-with-a-service-layer-cs - about 1/2 of the way down using the IValidationDictionary approach.
But I see this approach is not discussed in newer versions of the documentation. The validation in the service layer section is completely removed in the newer versions.
I hope that is enough context for the following questions / validation of my approach:
DataAnnotations are the current (MVC 4) best practice approach to model validation. In terms of the workflow of model validation, validation happens at the time of model binding which is when the MVC Framework examines values from the request and attempts to bind/hydrate/populate the parameters listed in the action method being targeted by the request.
When using a service layer with MVC it would be very natural and convenient to merge your DTOs with what are called View Models in MVC. The purpose of both is to only encapsulate the data that will be passed between two points. So I would say create one class to use as the DTO and View Model and tag its properties with the DataAnnotations for model validation.
This question is a little more subjective and also depends on the intended network architecture of the deployed application. A service/application layer would be inherent and necessary if you are targeting a 3-tier deployment architecture with a web, app and database server. That being said, if the network architecture is not set than there may be no real reason to have a service layer, particularly if there will be no need for other applications, either internal or external, to consume the logic contained in the service layer. It is perfectly fine to implement your business logic within the model validation and repository.