Замок Виндзор - это инверсионный инструмент управления. Есть и другие, как это.
Это может дать вам объекты с предварительно построенными и предварительно подключенными зависимостями прямо там. Весь граф объекта создается с помощью отражения и конфигурации, а не «нового» оператора.
Начните здесь: 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
Это просто происходит - потому что он знает, что и зачем нужно.
И вы можете написать меньше дефектов с помощью лучше разработанного, СУХОГО кода тестируемым и воспроизводимым способом.