1

我想創建門面類來處理兩個服務很少的操作。 對於那些接觸我有代理類業務。門面有兩個服務內部和依賴注入 - 設計模式的做法

有抽象的代理和業務的派生代理 - 如何創建架構的一部分,以避免解決門面?

class Facade 
{ 
    private Proxy proxy1; 
    private Proxy proxy2; 

    public Facade() 
    { 
     //I don't like this part 
     proxy1 = ...Resolve<Proxy1Type>(); 
     proxy2 = ...Resolve<Proxy2Type>(); 
    } 


    public void Do() 
    { 
     proxy1.Call(); 
     proxy2.Call(); 
    } 
} 

    abstract class Proxy {public void Call();} 
    class Proxy1Type : Proxy {public void override Call(){}} 
    class Proxy2Type : Proxy {public void override Call(){}} 

我應該用什麼設計模式來修復這種情況?

編輯

可選我應該在這個解決方案,但還是不喜歡它更

class Facade 
{ 
    private IProxy proxy1; 
    private IProxy proxy2; 

    //I feel it's still wrong 
    public Facade(IProxy1Type p1, IProxy2Type p2) 
    { 
     proxy1 = p1; 
     proxy2 = p2; 
    } 


    public void Do() 
    { 
     proxy1.Call(); 
     proxy2.Call(); 
    } 
} 
interface IProxy { void Call();} 
interface IProxy1Type : IProxy{} 
interface IProxy2Type : IProxy {} 
class Proxy1Type : IProxy1Type { public void Call() { } } 
class Proxy2Type : IProxy2Type { public void Call() { } } 

回答

1

你的問題表明,它們兩者有兩種相反的方法和。您可以決心使用Service Locator(第一樣品),或使用Dependency Injection外面注入他們一個類的內部依賴性。

依賴注入(constructor injection你的情況)已經得到了一些優勢:

  1. 它更清楚什麼是需要,因爲你不需要在類中挖掘找出Facade類正常工作是什麼它會嘗試解決(和什麼時候)。
  2. 測試Facade類,因爲你可以通過構造函數來注入測試雙打它更容易單元;在單元測試中不需要配置DI容器。

您可以在this post瞭解更多關於服務定位器(以及爲什麼你應該避免使用它)。