I have an ASP.NET MVC project with a Data layer (NHibernate and Repository pattern) a Service Layer and a Web (MVC) layer.
At the moment, for each Controller in the Web layer I have a matching service class in the Service Layer. This works fine, although there is some duplication of interface and logic between the service classes (more than one class needs a GetThingById() method) and my Home Controller uses multiple services (or there would be a huge amount of duplication in a dedicated Home controller).
Is there a better way to structure this?
Duplication usually means refactoring: Extract duplicated logic into it's on service, break everything down (Single Responsibility Principle) until there is no more duplication.
You then either simply inject multiple services into your controllers (as you already did for your home controller), or you may create classes which combine multiples services (see also Delegation, Facade, Decorator pattern and refactoring to aggregate services) and inject those.