Преимущество первого подхода заключается в том, что с помощью локатора сервисов вы можете легко заменить реализацию ICustomerService, если это необходимо.При втором подходе вам придется заменить каждую ссылку на конкретный класс CustomerRepository, чтобы переключиться на другую реализацию ICustomerService.
Еще лучший подход - использовать инструмент для внедрения зависимостей, такой как StructureMap или Ninject (есть много других) для управления вашими зависимостями.
Редактировать: К сожалению, многие типичные реализации выглядят так, поэтому я рекомендую интегрированную среду DI:
public interface IService {}
public interface ICustomerService : IService {}
public class CustomerService : ICustomerService {}
public interface ISupplerService : IService {}
public class SupplierService : ISupplerService {}
public static class MyService
{
public static T GetService<T>() where T : IService
{
object service;
var t = typeof(T);
if (t == typeof(ICustomerService))
{
service = new CustomerService();
}
else if (t == typeof(ISupplerService))
{
service = new SupplierService();
}
// etc.
else
{
throw new Exception();
}
return (T)service;
}
}