2010-07-05 21 views
6

¿Dónde radica la ventaja del primer enfoque para obtener datos de clientes?Service vs. Repository

ICustomerService customerService = MyService.GetService<ICustomerService>(); 
ICustomerList customerList = customerService.GetCustomers(); 

vs

ICustomerRepository customerRepo = new CustomerRepository(); 
ICustomerList customerList = customerRepo.GetCustomers(); 

Si usted entiende mi pregunta no se pregunte cómo la implementación de la clase MyService parece ;-)

aquí es la aplicación de la Repo ..

interface ICustomerRepository 
{ 
    ICustomerList GetCustomers(); 
} 

class CustomerRepository : ICustomerRepository 
{ 
    public ICustomerList GetCustomers() 
    {...} 
} 

Respuesta

4

La ventaja del primer enfoque es que mediante el uso de un localizador de servicios puede cambiar fácilmente t Implementación de ICustomerService si es necesario. Con el segundo enfoque, debería reemplazar cada referencia a la clase concreta CustomerRepository para cambiar a una implementación diferente de ICustomerService.

Un enfoque aún mejor es utilizar una herramienta de inyección de dependencia como StructureMap o Ninject (hay muchas otras) para administrar sus dependencias.

Edición: Lamentablemente muchas implementaciones típicas se ven así que es por eso que recomendamos un marco 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; 
    } 
} 
+0

@Jamie o LightCore http://lightcore.peterbucher.ch/ ;-) Bueno para una aplicación de escritorio con 10k LoC, no quiero usar una herramienta DI, Lightcore es muy pequeño ;-) ¿Puede mostrarme una implementación típica de dicho ServiceLocator? Supongo que MyService es una clase estática ¿verdad? – msfanboy

+0

ah ... ¿así que al final tendría 20 más si estuviera ejecutando 20 servicios diferentes? diablos, esto es como codificar vb: P por cierto. si le interesan más puntos: P http://stackoverflow.com/questions/3181522/c-services-access-the-dataprovider-class-running-the-sql-statements-correct-a – msfanboy

+0

Creo que hay buenas implementaciones de este patrón, pero este es uno que he visto (y escrito yo mismo). –