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

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

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


person David Hill    schedule 24.09.2008    source источник
comment
Читайте об инверсии управления. Это очень полезно для того, чтобы помочь вам отделить зависимости, что для начала очень поможет вам при написании модульных тестов.   -  person Dan Csharpster    schedule 22.10.2013


Ответы (5)


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

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

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

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

person Matt Hinze    schedule 24.09.2008
comment
КЛАССНО! Хорошо написан! СЕЙЧАС я в восторге от этого. - person David Hill; 24.09.2008
comment
Спасибо. Это еще не все. Я выбрал очень простой и до боли конкретный пример. Вы можете использовать интерфейсы для переключения реализаций. Вы можете автоматически настраивать целые сборки. Вы можете указать жизненные циклы, такие как singleton или per-http-request и т. Д. Продолжайте - это изменит вашу работу. - person Matt Hinze; 24.09.2008
comment
И в помощь разработчикам Java: это Guice для .NET ;-) - person Mark Renouf; 17.05.2009
comment
Я использую windsor с NHibernate и средством WCF - как только вы начнете играть с ним и увидите, что вы можете сделать с таким небольшим количеством строк кода - вы никогда не оглянетесь назад, он также очистит вашу кодовую базу и сделает ее более читаемой, как это обычно бывает меньше проводки и возни, и вы останетесь с настоящими гайками и болтами :) - person ; 05.05.2010
comment
Я считаю, что по своему опыту труднее отлаживать, потому что где инициализируются объекты? - В большом проекте сложно найти корень инициализации. Я предпочитаю старомодный способ использования new, тогда я знаю, где все находится. Мне также не нравится идея использования отражений, и это действительно черный ящик, код, которым мы не владеем и поэтому не полностью понимаем. - person Luke T O'Brien; 23.03.2016
comment
Хорошо написано, спасибо! Остается один вопрос: как Container.Get<WorkflowStepper>(); работает? Где этот объект сконфигурирован так, что ему не нужен оператор new? - person Matt; 07.07.2016
comment
@ LukeTO'Brien, очевидно, вы не пишете модульные тесты много / вообще. Без использования IoC / DI написание модульных тестов практически невозможно. - person bytedev; 22.09.2016
comment
@nashwan Да, я пишу модульный тест, но принципы IoC / DI могут применяться без Castle Windsor или какой-либо сторонней структуры, для меня это просто добавляет еще одну зависимость, об этом я и писал. Я просто не вижу преимуществ в Замке Виндзор. - person Luke T O'Brien; 23.09.2016
comment
@ LukeTO'Brien полностью с тобой согласен. Думал, вы имеете в виду, что вообще не использовали IoC / DI (даже без Виндзора) :-) - person bytedev; 26.09.2016

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

person IUnknown    schedule 11.08.2016

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

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

person Mike Socha III    schedule 18.02.2015

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

ссылка.

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

person Rakesh Burbure    schedule 07.03.2017

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

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

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

person andrew pate    schedule 22.03.2019