2015-04-17 185 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