2010-07-05 113 views
6

其中第一種獲取客戶數據的方法有哪些優勢?服務與存儲庫

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

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

如果你明白我的問題,你會不會問的MyService類的實現看起來像;-)

這裏是回購的實施.. 。

interface ICustomerRepository 
{ 
    ICustomerList GetCustomers(); 
} 

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

回答

4

第一種方法的優點是,通過使用服務定位器,您可以輕鬆地將t如果需要他執行ICustomerService。使用第二種方法,您必須將每個引用替換爲具體類CustomerRepository,才能切換到不同的ICustomerService實現。

更好的方法是使用依賴注入工具,如StructureMapNinject(還有很多其他)來管理您的依賴關係。

編輯:不幸的是許多典型的實現方式是這樣的這就是爲什麼我推薦一個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 或LightCore http://lightcore.peterbucher.ch/ ;-) 好對於具有10k LoC的桌面應用程序,我不想使用DI工具也Lightcore是該死的小;-) 你可以告訴我這種ServiceLocator的典型實現?我猜MyService是一個靜態類嗎? – msfanboy 2010-07-05 18:25:32

+0

啊...所以最後我會有20個其他的如果運行20個不同的服務?地獄這就像編碼vb:P btw。如果你對更多的點感興趣:P http://stackoverflow.com/questions/3181522/c-services-access-the-dataprovider-class-running-the-sql-statements-correct-a – msfanboy 2010-07-05 18:45:50

+0

我認爲有這個模式的好實現,但這是我見過的(並且自己寫的)。 – 2010-07-05 18:49:29