See the question and my original answer on StackOverflow

I would go for two simple ideas:

  1. try to define full names (namespace + type name) without redundancy (the same name portion - Domain, Person, Service, Model, Controller, ... - should not appear twice) whenever possible

  2. get inspiration from the .NET framework itself. There are more than 40000 classes in there! Open all the assemblies in a tool such as .NET Reflector or ILSpy and study it carefully.

I would come up with something like this:

 + Person
 + PersonService // Domain service
 + PersonRepository
Domain.ServiceModel // WCF, etc. I chose the same namespace as .NET Framework
 + PersonService // Service implementation, this is really a service so "service" redundancy seems unavoidable here
 + PersonController

Ok, it has the obvious inconvenient that the same type name appears multiple times in the hierarchy. Well, but that's why namespaces (and namespace aliases) exists also. I think it's not such a big deal.