Инверсия контроля или внедрение зависимости - кто-нибудь делает это на C? - PullRequest
3 голосов
/ 01 декабря 2009

См., Например, здесь

https://stackoverflow.com/questions/139299/difference-between-dependency-injection-di-inversion-of-control-ioc

чтобы напомнить себе, что такое IoC и DI.

Вопрос и ответ здесь

Является ли Inversion of Control специфичной для языков OO?

предполагает, что для него не требуется язык OO.

Теперь мой вопрос: кто-нибудь делает это в C?

Я спрашиваю, потому что мы пишем встроенный C и рассматриваем возможность применения этих методов без изменения нашего языка программирования.

Ответы [ 2 ]

2 голосов
/ 01 декабря 2009

Делать это в Си все время. Подсказка дается в ответе от Аздера по вашей второй ссылке:

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

С этой точки зрения концепция уже используется в стандартной библиотеке для функций qsort () и bsearch ().

0 голосов
/ 01 декабря 2009

В Windows у вас есть COM, который делает что-то подобное. У вас есть интерфейс и обеспечить реализацию в DLL. Вы регистрируете DLL, и этот процесс регистрации делает запись в реестре, отображающую интерфейс (UUID) и DLL, которая обеспечивает реализацию. Основываясь на этой информации, при выполнении QueryInterface () служба COM загрузит соответствующую DLL и создаст экземпляр объекта реализации, типизирует его в соответствии с запрошенным типом интерфейса и вернет.

Это IoC с использованием COM. Поскольку COM реализован на «C», я уверен, что он просто прорабатывает детали, чтобы заставить это работать на вашей встроенной системе. Вместо реестра вам понадобится файл для хранения этого отображения между интерфейсом, реализацией и DLL. Это сделано в Catia (из Dassault Systemes) в их архитектуре CNext (V5 / V6). Он называется структурой моделирования объектов.

Шаги для достижения этой цели:

  1. Определение соглашения об именах для функции, которая возвращает указатель на интерфейс
  2. Создать файл с интерфейсом и DLL, в котором он реализован
  3. Реализация интерфейса в DLL и обновление файла в # 2
  4. В основном коде прочитайте файл и создайте карту интерфейса и DLL
  5. Когда вам нужен интерфейс, загрузите DLL, если она не загружена, и получите адрес функции, которая возвращает указатель на интерфейс (на основе определенного соглашения об именах) Пример: Для интерфейса IDoSomething вашей функцией может быть Get_IDoSomething (). Поскольку мы получаем адрес функции на основе имени, это делается во время выполнения, а не во время компиляции.
  6. Вызовите функцию по адресу, который вы получили от # 5. Теперь у вас есть указатель на интерфейс, основанный на реализации в DLL, как указано в # 3

Поэтому вы привязываете интерфейс к его реализации во время выполнения.

...