2015-04-17 2 views
0

Кто-то сказал мне, что до того, как появились рамки внедрения инъекций, разработчики будут использовать фабрику для реализации DI. Может ли кто-нибудь представить пример использования заводского шаблона для DI. Я имею в виду, просто подумав об этом, фабрика - это инжектор, но я не могу найти какие-либо примеры в Интернете.Могу ли я использовать Factory для внедрения инъекции зависимостей

+0

Этот ответ может помочь. «Зависимость впрыска против заводского шаблона»: 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 за ваши юнит-тесты, и вы можете получить издевательство над CarFactory, посмеявшись над ICars при вызове CreateCar.

Теперь замените Автомобили на заводе фактическими зависимостями, такими как классы, которые реализуют службы. И вуаля, у вас есть Factory, который содержит все ваши зависимости. Теперь вы можете использовать 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 # должна иметь зависимость, «введенную» в ваш класс через ваши сеттеры. 2 # должен иметь ваши зависимости «впрыскиваться» через конструктор вашей классы. 3 #, чтобы ваши зависимости были доступны через глобальный объект, в данном случае CarFactory.SingletonInstance (поскольку он является статическим). Мне нравится глобальный объектный подход, поскольку он делает фокус подписчика вашего конструктора на бизнес-объектах (что имеет значение). Более причудливые рамки DI также позволяют специальным атрибутам метода «вводить» зависимости. – TchiYuan

Смежные вопросы