#c# #design-patterns #dependency-injection
#c# #шаблоны проектирования #внедрение зависимостей
Вопрос:
Я читал о DI, и это кажется достаточно простой концепцией. Чего я не получаю, так это контейнера. Допустим на мгновение, что я хочу создать свой собственный контейнер. Используются такие глаголы, как «обнаруживать», и я не понимаю, как контейнер «обнаруживает», что был создан новый зависимый объект, и знает, как внедрить его зависимости. Мне кажется, что контейнер — это прославленная фабрика.
Может ли кто-нибудь объяснить, как на самом деле реализован контейнер, или, может быть, указать мне на ресурс?
Спасибо!
Ответ №1:
Это взято из документации Windsor
Инверсия управления
Инверсия управления — это принцип, используемый фреймворками как способ, позволяющий разработчикам расширять фреймворк или создавать приложения, использующие его. Основная идея заключается в том, что фреймворк знает об объектах программиста и выполняет над ними вызовы.
Это противоположно использованию API, где код разработчика выполняет вызовы кода API. Следовательно, фреймворки инвертируют элемент управления: за это отвечает не код разработчика, вместо этого фреймворк выполняет вызовы на основе некоторого стимула.
Вы, вероятно, были в ситуациях, когда вы разрабатывали в свете этого принципа, даже если вы не знали об этом.
Инверсия контейнера управления
Инверсия контейнера управления использует принцип, изложенный выше, для (в двух словах) управления классами. То есть их создание, уничтожение, время жизни, конфигурация и зависимости. Таким образом, классам не нужно получать и настраивать классы, от которых они зависят. Это значительно уменьшает связь в системе и, как следствие, упрощает повторное использование и возможность тестирования.
Существует некоторая путаница, созданная людьми, которые думают, что «Инверсия управления» является синонимом «Инверсии контейнера управления». Как уже говорилось, инверсия управления является более широким принципом.
Часто люди думают, что все дело в «внедрении», и вещают, что это основная цель контейнеров IoC. На самом деле, «внедрение» — это следствие, средство для разделения, а не основная цель.
Ответ №2:
Возможно, вы захотите прочитать эту книгу Внедрение зависимостей в .NET… Я уже прочитал это, и я настоятельно рекомендую вам прочитать это. Сначала он дает хорошее и понятное объяснение DI, а затем показывает код и шаблоны о реальных приложениях DI.
Из этой книги, и в слишком немногих словах…
"DI container is the technology used to support the DI technique" Page 55
Комментарии:
1. Да, это так. Кстати, Марк Симан активно сотрудничает с stackoverflow, я полагаю, вы можете легко связаться с ним и спросить напрямую.