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

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

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

Читайте об инверсии управления. Это очень полезно для того, чтобы помочь вам развязать зависимости, что очень поможет вам при написании юнит-тестов.
Dan Csharpster 22.10.2013 17:48:10
5 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

354
18.02.2014 17:10:49
КЛАССНО! Хорошо написанный! СЕЙЧАС я взволнован об этом.
David Hill 24.09.2008 12:45:14
Спасибо. Это намного больше. Я выбрал очень простой и мучительно конкретный пример. Вы можете использовать интерфейсы для переключения реализаций. Вы можете автоматически настраивать целые сборки. Вы можете указать жизненные циклы, такие как singleton или per-http-request и т. Д. Продолжайте - это изменит вашу работу.
Matt Hinze 24.09.2008 17:19:35
И чтобы помочь людям Java: Это Guice для .NET ;-)
Mark Renouf 16.05.2009 22:10:43
Я обнаружил, что по моему опыту сложнее отлаживать, потому что где инициализируются объекты? - В большом проекте трудно найти корень инициализации. Я предпочитаю старомодный способ использования new, я знаю, где все тогда. Мне также не нравится идея использования отражений, и это действительно черный ящик, код, которым мы не владеем и поэтому не до конца понимаем.
Luke T O'Brien 23.03.2016 12:21:29
@nashwan Да, я пишу модульный тест, но принципы IoC / DI можно применять без Castle Windsor или каких-либо сторонних фреймворков, для меня это просто добавляет еще одну зависимость, которая была точкой моего комментария. Я просто не вижу преимуществ для Виндзорского замка.
Luke T O'Brien 23.09.2016 18:04:28

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

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

3
18.02.2015 18:46:09

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

3
11.08.2016 13:00:28

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

ссылка .

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

2
30.01.2018 09:48:15

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

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

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

0
22.03.2019 12:17:02