Ioc — это инвертирование элемента управления в объектно-ориентированном дизайне для достижения слабой связи.

Слабое связывание – это подход к соединению различных частей системы таким образом, чтобы одна часть меньше зависела от другой. Его основная цель — ограничить любые дополнительные изменения в других частях системы при изменении компонента.

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

Пример кода без Ioc

Проблемы с этой реализацией

  • Тесно связанные классы. Любые изменения в ContractDAO повлияют на ContractBusinessLogic, поскольку ContractBusinessLogic зависит от конкретного класса ContractDAO. Добавление, удаление или изменение методов в ContractDAO также повлияет на ContractBusinessLogic.
  • Использование «new ContractDAO» в ContractBusinessLogic повлияет на все классы в системе, использующие этот класс, если он изменит имя.
  • ContractBusinessLogic создает конкретный класс ContractDAO. Его нельзя заменить фиктивным классом в дизайне через тестирование и протестировать без конкретной реализации.

Решение с использованием Factory шаблона

Преобразование элемента управления в DAOFactory

Проблема

Класс DAOFactory используется внутри класса ContractBusinessLogic. Если существует другая реализация IContractDAO, нам также необходимо изменить DAOFactory и ContractBusinessLogic.

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

Определение принципа инверсии зависимостей

Модули высокого уровня не должны зависеть от модулей низкого уровня. Оба должны зависеть от абстракции.

Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.

Нам нужно создать класс-инжектор класса DependencyInjection, который внедряет реализацию IContractDAO в класс ContractBusinessLogic.

Некоторые преимущества такого подхода

  • Код становится более модульным
  • Слабая связь
  • Больше гибкости за счет внедрения зависимостей во время выполнения

Внедрение зависимостей и Шаблон стратегии можно использовать для создания слабосвязанных классов.

Для более сложных приложений реализация этих шаблонов требует много времени и усилий. Здесь на помощь приходит контейнер IoC.

Хорошо известные контейнеры IoC