2015-05-01 1 views
0

Скажем, у меня есть следующий код:spring4d разрешить локальный ИЗГОТОВЛЕНА класс

interface 
     type 
      IMyInterface1 = interface // GUID 
      procedure ButtonEvent(Sender: TObject); 
      end; 

      IMyInterface2 = interface // GUID 
      procedure DoSomething; 
      end; 

      TMyClass1 = class(TInterfacedObject, IMyInterface1) 
      public 
      procedure ButtonEvent(Sender: TObject); 
      end; 

      TMyClass2 = class(TInterfacedObject, IMyInterface2) 
      public 
      procedure DoSomething; 
      end; 

// ... 
implementation   
     procedure TMyClass1.ButtonEvent(Sender: TObject); 
     var 
      aIntf2: TMyInterface2; 
     begin 
      // Pseudo code: 
      // aIntf2 := ServiceLocator.GetService<IMyInterface2>; 
      try 
      aIntf2.DoSomething; 
      finally 
      aIntf2 := nil; // will free the instance... 
      end; 
     end; 

    initialization 
     // Pseudo code: 
     // GlobalContainer register IMyInterface1/TMyClass1 
     // GlobalContainer register IMyInterface2/TMyClass2 
     // GlobalContainer.Build 
    end. 

Метод ButtonEvent вызывается с помощью формы Дельфи события нажатия кнопки.

Теперь мой вопрос: Есть ли лучший способ создать экземпляр класса TMyClass2? Инъекция в класс TMyClass1 в моем случае невозможна, время жизни экземпляра TMyClass2 находится только внутри ButtonEvent. Следующий вызов ButtonEvent должен использовать другой экземпляр ...

AFAIK, инъекция параметра метода или локальная переменная в Spring4D невозможна, не так ли?

ответ

1

Если вы хотите избежать страшного шаблона локатора службы, который не решает проблему, которую решает DI, но просто переносит ее (или во многих случаях даже ухудшает ситуацию, потому что у вас есть псевдодекодированный код, который по-прежнему имеет зависимости, которые вы только испытываете как только вы запустите код и выясните, что вам нужно зарегистрировать какой-либо тип, чтобы заставить локатор службы возвращать правильную вещь).

Способ ввода параметров или локальная переменная впрыска? Как это было бы возможно. Это потребует некоторого перехвата вызова, чтобы контейнер вносил что-то в регистры/стек.

Хотя перехват возможен для определенных методов (виртуальных), которые по-прежнему требуют, чтобы вызываемый экземпляр был настроен для этого. И если вы это сделаете, вы могли бы ввести вашу зависимость в первую очередь.

Если вы не размещаете DI в своем корне композиции, вам всегда нужно использовать какой-то локатор обслуживания внутри кода, из которого вы хотите начать процесс инъекции зависимостей.

Подумайте о DI и особенно использовании контейнера в качестве инструмента для достижения чего-то определенного: в основном развязывайте свой код для его различных преимуществ. Как я уже сказал, использование локатора сервисов в таких случаях может вызвать больше проблем, чем решает.

Однако вернемся к вашему примеру: это классический случай использования фабрики. Вам нужно ввести это в свой TMyClass1. Затем он может вызвать фабрику в вашем методе и получить IMyInterface2. В зависимости от версии Spring4D, которую вы используете, существуют различные способы, с помощью которых контейнер может сэкономить вам некоторую работу, поскольку он может построить завод для вас. Но я предлагаю писать фабрику самостоятельно, используя классический образец. Таким образом, вы почувствуете это. Позже, когда вы более опытные и уверенные в своем использовании, и где использовать контейнер, вы можете легко взять на себя эту часть.

+0

Хорошо ... теперь я понимаю ... завод является хорошим решением для этого. Что касается метода или инъекции параметров с использованием прокси-серверов, таких как java spring? Таким образом, аспектное программирование также возможно в один прекрасный день ... – Markus

+0

Перейдите на наши форумы (ссылка на странице нашего проекта) и задайте этот вопрос там с некоторыми примерами, чтобы я мог понять, чего именно вы хотите достичь. Я не думаю, что такое обсуждение можно или нужно рассматривать здесь. –

+0

Как я вижу, Spring Container имеет способ регистрации фабрики: TContainer.RegisterFactory 1. Есть ли пример того, как его использовать? 2. Могу ли я заставить spring4d делать инъекции для факторизованных экземпляров? – Markus

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

  • Нет связанных вопросов^_^