Що таке Замок Віндзор, і чому я повинен піклуватися?


191

Я давно розробник Windows, порізавши зуби на win32 та ранньому COM. Я працюю з .NET з 2001 року, тому я досить добре володію C # та CLR. Я ніколи не чув про Замок Віндзор, поки не почав брати участь у стеці. Я прочитав посібник "Початок роботи" Castle Windsor, але він не клацає.

Навчіть цього старого собаку нових хитрощів та скажіть мені, чому я повинен інтегрувати Castle Windsor у свої додатки для підприємств.


1
Прочитайте на Інверсія управління. Це дуже корисно для того, щоб допомогти вам розв’язати залежності, що допоможе вам у написанні одиничних тестів, для початківців.
Dan Csharpster

Відповіді:


360

Замок Віндзор - це інверсія інструменту управління. Є й інші подібні.

Він може давати вам об’єкти із заздалегідь побудованими та попередньо провідними залежностями. Цілий графік об'єкта, створений за допомогою відображення та конфігурації, а не "нового" оператора.

Почніть тут: 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

Це просто відбувається - тому що він знає, що потрібно для чого.

І ви можете записати менше дефектів за допомогою кращого дизайну DRY-коду перевіряючим та повторюваним способом.


30
ДУЖЕ! Добре написано! ЗАРАЗ я в захваті від цього.
Девід Хілл

1
Дякую. Є ще багато чого. Я вибрав дуже простий і болісно конкретний приклад. Ви можете використовувати інтерфейси для вимкнення реалізацій. Ви можете автоматично налаштувати цілі збірки. Ви можете вказати життєві цикли, як одиночний або за запитом http тощо. Продовжуйте роботу - це змінить вашу роботу.
Метт Хінзе

6
І щоб допомогти людям Java: Це Guice для .NET ;-)
Марк Реноф

5
Я вважаю, що на моєму досвіді важче налагоджувати, бо де ініціалізовані об'єкти ?? - У великому проекті важко знайти корінь ініціалізації. Я віддаю перевагу старомодному способу використання new, я знаю, де все тоді. Мені також не подобається ідея використання роздумів, і це дійсно чорна скринька, код у нас не є, і тому ми не повністю розуміємо.
Люк Т О'Брайен

1
@nashwan Так, я пишу одиничний тест, але принципи IoC / DI можна застосовувати без Castle Windsor або будь-якого третього боку, для мене це просто додає ще одну залежність, це було моїм коментарем. Я просто не бачу переваг Castle Windsor.
Luke T O'Brien

4

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


3

Я думаю, що ІОК є кроком у правильному напрямку на шляху до підвищення продуктивності та задоволення команди розвитку (включаючи PM, BA та BO). Це допомагає встановити поділ проблем між розробниками та тестуванням. Це дає спокій під час архітектури, що забезпечує гнучкість, оскільки рамки можуть входити і виходити.

Найкращий спосіб досягти мети, яку вирішує IoC (CW або Ninject тощо) - це усунути політику №1 та №2, щоб усунути потребу розробників, щоб під час розробки поставити фасад помилкового розуміння. Ці два рішення не здаються пов'язаними з IoC? Вони є :)


3

Замок Віндзор - Dependency Injection container.Це означає, що за допомогою цього ви можете ввести свої залежності та використовувати їх, не створюючи їх за допомогою нового ключового слова. Наприклад, врахуйте, що ви написали сховище чи послугу, і ви хочете використовувати його в багатьох місцях, вам потрібно спочатку зареєструвати вашу службу / сховище, і ви можете почати використовувати її після введення її в потрібне місце. Ви можете подивитися нижче підручник, який я слідував, щоб дізнатися вітровий замок.

посилання .

Сподіваюся, це допоможе вам.


1

Простіше кажучи. Уявіть, що у вашому коді похований якийсь клас, для виконання якого потрібно кілька простих значень конфігурації. Це означає, що все, що створює екземпляр цього класу, потрібно отримати ці залежності, тому вам зазвичай доводиться рефакторировать навантаження класів по дорозі, щоб просто передати трохи конфігурації до місця, де створюється екземпляр.

Тож або багато класів зайве не змінювати, ви збираєте значення конфігурацій в один великий клас конфігурацій, що також погано ... або, що найгірше, все-таки йде Locator служби!

IoC дозволяє вашому класу отримувати всі свої залежності, не маючи цього клопоту, а також керує життями екземплярів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.