Что такое Виндзорский замок и почему меня это должно волновать?


191

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

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


1
Читайте об инверсии управления. Это очень полезно для того, чтобы помочь вам развязать зависимости, что поможет вам при написании юнит-тестов.
Дэн Чарпстер

Ответы:


360

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

Это может дать вам объекты с предварительно построенными и предварительно подключенными зависимостями прямо там. Весь граф объекта создается с помощью отражения и конфигурации, а не «нового» оператора.

Начните здесь: 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

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

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


30
ЗДОРОВО! Хорошо написанный! СЕЙЧАС я взволнован об этом.
Дэвид Хилл

1
Спасибо. Это намного больше. Я выбрал очень простой и мучительно конкретный пример. Вы можете использовать интерфейсы для переключения реализаций. Вы можете автоматически настраивать целые сборки. Вы можете указать жизненные циклы, такие как singleton или per-http-request и т. Д. Продолжайте - это изменит вашу работу.
Мэтт Хинце

6
И чтобы помочь людям Java: Это Guice для .NET ;-)
Марк Ренуф

5
Я обнаружил, что по моему опыту сложнее отлаживать, потому что где инициализируются объекты? - В большом проекте трудно найти корень инициализации. Я предпочитаю старомодный способ использования new, я знаю, где все тогда. Мне также не нравится идея использования отражений, и это действительно черный ящик, код, которым мы не владеем и поэтому не до конца понимаем.
Люк Т О'Брайен,

1
@nashwan Да, я пишу модульный тест, но принципы IoC / DI можно применять без Castle Windsor или каких-либо сторонних фреймворков, для меня это просто добавляет еще одну зависимость, которая была точкой моего комментария. Я просто не вижу преимуществ для Виндзорского замка.
Люк Т О'Брайен

4

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


3

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

Лучший способ достичь цели, которую ставит перед собой IoC (CW или Ninject и т. Д.), Состоит в том, чтобы устранить политику № 1 и № 2, устраняя необходимость для разработчиков ставить на передний план ложное понимание при разработке. Эти два решения не имеют отношения к IoC? Они есть :)


3

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

ссылка .

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


1

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.