Я давний разработчик Windows, порезав зубы на win32 и раннем COM. Я работаю с .NET с 2001 года, поэтому я довольно свободно говорю на C # и CLR. Я никогда не слышал о замке Виндзор, пока не начал участвовать в переполнении стека. Я прочитал руководство по началу работы в Castle Windsor, но оно не щелкает.
Научите эту старую собаку новым приемам и скажите, почему я должен интегрировать Castle Windsor в свои корпоративные приложения.
Ответы:
Замок Виндзор - это инверсионный инструмент управления. Есть и другие, как это.
Это может дать вам объекты с предварительно построенными и предварительно подключенными зависимостями прямо там. Весь граф объекта создается с помощью отражения и конфигурации, а не «нового» оператора.
Начните здесь: 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
Это просто происходит - потому что он знает, что и зачем нужно.
И вы можете написать меньше дефектов с помощью лучше разработанного, СУХОГО кода тестируемым и воспроизводимым способом.
источник
new
, я знаю, где все тогда. Мне также не нравится идея использования отражений, и это действительно черный ящик, код, которым мы не владеем и поэтому не до конца понимаем.Mark Seemann написал отличную книгу о DI (Dependency Injection), которая является подмножеством МОК. Он также сравнивает количество контейнеров. Я не могу рекомендовать эту книгу достаточно. Название книги: «Внедрение зависимостей в .Net» https://www.manning.com/books/dependency-injection-in-dot-net
источник
Я думаю, что IoC - это трамплин в правильном направлении на пути к большей производительности и удовольствию команды разработчиков (включая PM, BA и BO). Это помогает установить разделение проблем между разработчиками и для тестирования. Это дает душевное спокойствие при архитектуре, что обеспечивает гибкость, так как фреймворки могут входить и выходить.
Лучший способ достичь цели, которую ставит перед собой IoC (CW или Ninject и т. Д.), Состоит в том, чтобы устранить политику № 1 и № 2, устраняя необходимость для разработчиков ставить на передний план ложное понимание при разработке. Эти два решения не имеют отношения к IoC? Они есть :)
источник
Castle Windsor is
Dependency Injection container.
означает, что с помощью этого вы можете внедрить свои зависимости и использовать их, не создавая их с помощью нового ключевого слова. Например, предположим, что вы написали репозиторий или сервис и хотите использовать его во многих местах, вам необходимо сначала зарегистрировать свой сервис / репозиторий, и вы можете начать использовать его после внедрения его в требуемом месте. Вы можете взглянуть на урок ниже, который я использовал, чтобы изучить замок Виндзор.ссылка .
Надеюсь, это поможет вам.
источник
Проще говоря. Представьте, что в вашем коде скрыт какой-то класс, для выполнения которого требуется несколько простых значений конфигурации. Это означает, что все, что создает экземпляр этого класса, нуждается в получении этих зависимостей, так что вам обычно приходится реорганизовывать множество классов по пути, чтобы просто передать немного конфигурации туда, где создается экземпляр.
Таким образом, либо множество классов без необходимости изменяются, вы объединяете значения конфигурации в один большой класс конфигурации, что тоже плохо ... или, что еще хуже, все равно идете в Service Locator!
IoC позволяет вашему классу получать все свои зависимости без этих хлопот и более явно управляет временем жизни экземпляров.
источник