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