Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Создание системы DI/IoC для Delphi: Использование TDictionary для управления зависимостями

Delphi , Компоненты и Классы , Классы

Вопросы проектирования и управления зависимостями в программировании на языке Delphi и Pascal часто требуют разработки инверсии управления (IoC) и внедрения зависимостей (DI). Эти паттерны помогают снизить связность между компонентами приложения, облегчая его поддержку и тестирование. В данной статье мы рассмотрим создание простой системы DI/IoC, используя TDictionary для управления абстрактными классами и их реализациями.

Цели системы DI/IoC:

  1. Избегать прямого создания экземпляров классов по типу.
  2. Автоматическая регистрация класса при включении его единицы в проект.
  3. Объявление реализующих классов только в разделе реализации.
  4. Использование конструкторов классов вместо секций инициализации.

Проблема:

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

Решение:

После обсуждения с сообществом было подтверждено, что ожидания от конструктора класса не соответствуют его дизайну. Конструктор класса не вызывается автоматически при первом создании экземпляра класса. Регистрационные функции должны быть размещены в секции инициализации, чтобы гарантировать вызов конструктора класса. Это позволит классу быть "каснутым" и зарегистрированным в системе DI/IoC.

Пример кода:

TSite = class abstract(TObject)
  function GetURL: string; virtual; abstract;
  property URL: string read GetURL;
end;

TSites = class(TList<TSite>);

TThisApplication = class abstract(TObject)
  function Sites: TSites; virtual; abstract;
end;

TThisApplicationConcrete = class(TThisApplication)
  class constructor ClassCreate; strict private
    FSites: TSites;
    function Sites: TSites; override;
  end;

class constructor TThisApplicationConcrete.ClassCreate;
begin
  RegisterImplementorClass(TThisApplication, TThisApplicationConcrete);
end;

function TThisApplicationConcrete.Sites: TSites;
var
  SiteList: TSites;
begin
  if not Assigned(FSites) then begin
    SiteList := TSites.Create;
    FSites := SiteList;
  end;
  Result := FSites;
end;

function ThisApplication: TThisApplication;
var
  ImplementorClass: TClass;
begin
  ImplementorClass := GetImplementorClass(TThisApplication);
  if Assigned(ImplementorClass) then
    Result := ImplementorClass.Create as TThisApplication;
  else
    Result := nil;
end;

Инициализация:

Initialization
  RegisterImplementorClass(TThisApplication, TThisApplicationConcrete);
End.

Полный пример кода:

Для тех, кто хочет экспериментировать, полный код тестовых проектов доступен по ссылке: http://www.bjsoftware.com/delphistuff/stackoverdlow/classconstructors.zip.

Вывод:

Разработка системы DI/IoC с использованием TDictionary для управления зависимостями в Delphi требует понимания того, как работают конструкторы классов и секции инициализации. Размещение регистрационных функций в секции инициализации позволяет гарантировать, что конструктор класса будет вызван и класс будет зарегистрирован в системе, что является ключевым для функционирования системы DI/IoC.

Создано по материалам из источника по ссылке.

Создание системы DI/IoC (зависимостей внедрением/контроля инверсии) для программирования на Delphi с использованием TDictionary для управления классами и их реализациями.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Классы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 20:54:24/0.0052750110626221/1