Что такое Виндзорский замок и почему меня это должно волновать? - PullRequest
182 голосов
/ 24 сентября 2008

Я давний разработчик для Windows, порезав зубы на win32 и раннем COM. Я работаю с .Net с 2001 года, поэтому я довольно свободно говорю на C # и CLR. Я никогда не слышал о замке Виндзор, пока не начал участвовать в переполнении стека. Я прочитал руководство по началу работы в Castle Windsor, но оно не щелкает.

Научите эту старую собаку новым трюкам и скажите, почему я должен интегрировать Castle Windsor в свои корпоративные приложения.

Ответы [ 5 ]

349 голосов
/ 24 сентября 2008

Castle Windsor - это инверсионный инструмент управления. Есть и другие, как это.

Он может дать вам объекты с предварительно построенными и предварительно смонтированными зависимостями прямо там. Весь граф объектов, созданный с помощью отражения и конфигурации, а не оператора "new".

Начните здесь: http://tech.groups.yahoo.com/group/altdotnet/message/10434


Представьте, что у вас есть класс для отправки электронной почты. EmailSender. Представьте, что у вас есть другой класс WorkflowStepper. Внутри WorkflowStepper вам нужно использовать EmailSender.

Вы всегда можете сказать new EmailSender().Send(emailMessage);

но это - использование new - создает Плотную муфту, которую трудно изменить. (это крошечный надуманный пример в конце концов)

Так что, если вместо того, чтобы обновить этого плохого парня внутри WorkflowStepper, вы просто передали его в конструктор?

Итак, кто бы ни позвонил, он должен был обновить EmailSender.

new WorkflowStepper(emailSender).Step()

Представьте, что у вас есть сотни этих маленьких классов, которые несут только одну ответственность (Google SRP) .. и вы используете несколько из них в WorkflowStepper:

new WorkflowStepper(emailSender, alertRegistry, databaseConnection).Step()

Представьте, что вам не нужно беспокоиться о деталях EmailSender, когда вы пишете WorkflowStepper или AlertRegistry

Вы просто беспокоитесь о беспокойстве, с которым работаете.

Представьте себе, что весь этот график (дерево) объектов и зависимостей подключен в RUN TIME, поэтому, когда вы делаете это:

WorkflowStepper stepper = Container.Get<WorkflowStepper>();

вы получите реальную сделку WorkflowStepper со всеми зависимостями, автоматически заполненными там, где они вам нужны.

Нет new

Это просто происходит - потому что он знает, что для чего нужно.

И вы можете написать меньше дефектов с помощью лучшего разработанного, СУХОГО кода тестируемым и воспроизводимым способом.

3 голосов
/ 11 августа 2016

Марк Симанн написал отличную книгу о DI (Dependency Injection), которая является подмножеством МОК. Он также сравнивает количество контейнеров. Я не могу рекомендовать эту книгу достаточно. Название книги: «Внедрение зависимостей в .Net» https://www.manning.com/books/dependency-injection-in-dot-net

3 голосов
/ 18 февраля 2015

Я думаю, что IoC - это ступенька в правильном направлении на пути к большей производительности и удовольствию команды разработчиков (включая PM, BA и BO). Это помогает установить разделение проблем между разработчиками и для тестирования. Это дает душевное спокойствие при архитектуре, что обеспечивает гибкость, так как фреймворки могут входить и выходить.

Лучший способ достичь цели, которую ставит перед собой IoC (CW или Ninject и т. Эти два решения не имеют отношения к IoC? Это:)

1 голос
/ 07 марта 2017

Castle Windsor - Dependency Injection container. Это означает, что с помощью этого вы можете внедрить свои зависимости и использовать их, не создавая их с помощью нового ключевого слова. например Предположим, что вы написали репозиторий или сервис, и вы хотите использовать его во многих местах, вам необходимо сначала зарегистрировать свой сервис / репозиторий, и вы можете начать использовать его после внедрения в нужное место. Вы можете взглянуть на приведенный ниже учебник, которому я следовал, чтобы выучить замок Виндзор.

ссылка .

Надеюсь, это поможет вам.

0 голосов
/ 22 марта 2019

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

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

IoC позволяет вашему классу без проблем получать все свои зависимости, а также более явно управляет временем жизни экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...