Этот пример можно найти в библиотеке 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 местах в проекте на надо будет ничего переписывать, и будет вызываться уже инстанс с новой реализацией.
Таким образом, достигнута слабая связность, что довольно удобно при перекомпоновке проекта.