Delphi. Dependency Injection With Spring

Этот пример можно найти в библиотеке Spring for Delphi, где-то примерно здесь

C:\Work\DSeattle\libs\sglienke-spring4d\Samples\IntroToDependencyInjection\6-UseContainer

Как это работает? Для начала нам нужно зарегистрировать в контейнере классы

unit uRegistrations;

interface

uses
  Spring.Container;

procedure RegisterTypes(const container: TContainer);

implementation

uses
  uOrderEntry,
  uOrderProcessor,
  uOrderValidator;

procedure RegisterTypes(const container: TContainer);
begin
  container.RegisterType<TOrderEntry>;
  container.RegisterType<TOrderValidator>;

  container.Build;
end;

end.

Теперь, в основном коде программы мы делаем примерно что-то такое…

...
  RegisterTypes(GlobalContainer);
  Order := TOrder.Create;
  try
    OrderValidator := GlobalContainer.Resolve<IOrderValidator>;
    OrderEntry := GlobalContainer.Resolve<IOrderEntry>;
    OrderProcessor := TOrderProcessor.Create(OrderValidator, OrderEntry);
    if OrderProcessor.ProcessOrder(Order) then
      Writeln('Order successfully processed....');
  finally
    Order.Free;
  end;
...

Как видно из кода, мы просим контейнер дать инстанс, реализующий интерфейс и далее, просто работаем с ним.

Когда нам понадобится другая реализация интерфейса, мы просто в одном месте подменим регистрацию, и на во всех 10 000 местах в проекте на надо будет ничего переписывать, и будет вызываться уже инстанс с новой реализацией.

Таким образом, достигнута слабая связность, что довольно удобно при перекомпоновке проекта.

This entry was posted in Без рубрики. Bookmark the permalink.