2015-04-17 184 views
0

有人告訴我,在依賴注入框架出現之前,開發人員會使用工廠來實現DI。任何人都可以提供一個工廠模式如何用於DI的例子。我的意思是,僅僅考慮一個工廠是一個依賴注入器,但我無法在網絡上找到任何示例。我可以使用工廠來實現依賴注入嗎

+0

此答案可能會有所幫助。 「依賴注入VS工廠模式」:http://stackoverflow.com/a/12399680/4797330 – BranLakes

回答

1

這離我的頭頂,未經測試的代碼(用C#)

public class CarFactory : ICarFactory{ 

    private static CarFactory instance = null; 

    public static ICarFactory SingletonInstance { 
     get { 
      if (this.instance == null){ 
       this.instance = new CarFactory(); 
       return this.instance; 
      } 
     }, 
     set { 
      this.instance = value; 
     } 
    } 

    public ICar CreateCar(string make){ 

     switch(make) 
     { 
      case "Toyota": return new Toyota(); 
      case "Honda" : return new Honda(); 
      default: throw new Exception(); 
     } 

    } 

} 

public interface ICarFactory { 
    ICar CreateCar(string make); 
} 

public class Toyota : ICar 
{ 
} 

public class Honda : ICar 
{ 
} 

和使用情況會是這樣的:

ICar car = CarFactory.SingletonInstance.CreateCar("Toyota"); 

揭露CarFactory的一個實例,公開可讓您爲你的單元測試嘲笑CarFactory,你可以在調用CreateCar時讓你的模擬CarFactory返回嘲弄的ICar。

現在通過實際的依賴項(例如實現服務的類)來替換工廠中的汽車。瞧,你有一個包含你所有依賴的工廠。您現在可以使用Factory來「解析」您的依賴關係。你可以採取的例子,並進一步通過使用泛型類型和字典(哈希表),其中的關鍵是類型名稱和價值實現的實例,如推:

public T Create<T>(){ 
    return mydictionary.get(typeof(T).Name); 
} 

類似的東西...你得到漂移...

希望它有幫助!

+0

那麼你會同意,依賴注入只不過是一個工廠實現? – j2emanue

+0

這不只是給你一個服務定位器,而不是依賴注入?看到[這個問題]的答案(http://stackoverflow.com/questions/1557781/whats-the-difference-between-the-dependency-injection-and-service-locator-patte)。 –

+0

有幾種使用依賴注入的方法:1#通過你的setters在你的類中「注入」依賴。 2#是通過你的classe的構造函數「注入」你的依賴關係。 3#是讓你的依賴通過一個全局對象來訪問,在這個例子中是CarFactory.SingletonInstance(因爲它是靜態的)。我喜歡全局對象方法,因爲它使您的構造函數的簽名專注於業務對象(重要的東西)。更多花哨的DI框架還允許特殊的方法屬性「注入」依賴關係。 – TchiYuan