2010-07-05 4 views
6

Worin liegt der Vorteil der ersten Annäherung, Kundendaten zu erhalten?Service vs. Repository

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

gegen

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

Wenn Sie meine Frage verstehen Sie werden nicht fragen, wie die Umsetzung der MyService Klasse wie ;-)

sieht hier ist die Umsetzung des Repo .. .

interface ICustomerRepository 
{ 
    ICustomerList GetCustomers(); 
} 

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

Antwort

4

Der Vorteil des ersten Ansatzes besteht darin, dass Sie mit einem Service Locator einfach t auslagern können Die Implementierung von ICustomerService bei Bedarf. Mit dem zweiten Ansatz müssten Sie jeden Verweis auf die konkrete Klasse CustomerRepository ersetzen, um zu einer anderen ICustomerService-Implementierung zu wechseln.

Ein noch besserer Ansatz besteht darin, ein Abhängigkeitsinjektionswerkzeug wie StructureMap oder Ninject (es gibt viele andere) zu verwenden, um Ihre Abhängigkeiten zu verwalten.

Edit: Leider sind viele typische Implementierungen so aussehen, weshalb ich einen DI Rahmen empfehlen:

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 oder Lightcore http://lightcore.peterbucher.ch/ ;-) Well für eine Desktop-App mit 10k LoC will ich kein DI-Tool verwenden auch Lightcore ist verdammt klein ;-) Kannst du mir eine typische Implementierung eines solchen ServiceLocators zeigen? Ich denke, MyService ist eine statische Klasse richtig? – msfanboy

+0

ah ... also am Ende hätte ich 20 andere, wenn es 20 verschiedene Dienste läuft ?? Hölle das ist wie Codierung Vb: P BTW. Wenn Sie in mehr Punkte interessiert sind: P http://stackoverflow.com/questions/3181522/c-services-access-the-dataprovider-class-running-the-sql-statements-correct-a – msfanboy

+0

Ich denke, es gibt gute Implementierungen dieses Musters, aber das ist eines, das ich gesehen habe (und selbst geschrieben habe). –

Verwandte Themen