Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: David HillОтветов: 5

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

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

  • Читайте об инверсии управления. Это очень полезно для того, чтобы помочь вам отделить зависимости, что для начала очень поможет вам при написании модульных тестов. Dan Csharpster 22.10.2013

dependency-injectioncastle-windsorinversion-of-control

Ответы

Ответ 1 · рейтинг 369 · Matt Hinze

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

Он может предоставить вам объекты с предварительно созданными и предварительно связанными зависимостями прямо там. Целый граф объекта, созданный с помощью отражения и конфигурации, а не с помощью оператора 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

Вы просто беспокоитесь о том, над чем работаете.

Представьте себе, что весь этот граф (дерево) объектов и зависимостей подключается во ВРЕМЯ РАБОТЫ, так что, когда вы это сделаете:

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

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

Нет new

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

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

Ответ 2 · рейтинг 4 · IUnknown

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

Ответ 3 · рейтинг 3 · Mike Socha III

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

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

Ответ 4 · рейтинг 3 · Rakesh Burbure

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

ссылка.

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

Ответ 5 · рейтинг 1 · andrew pate

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы