Castle Windsor คืออะไรและทำไมฉันถึงต้องแคร์?


191

ฉันเป็นนักพัฒนา Windows มาเป็นเวลานานโดยตัดฟันของฉันใน win32 และ COM ต้น ฉันทำงานกับ. NET ตั้งแต่ปี 2001 ดังนั้นฉันจึงค่อนข้างคล่องแคล่วใน C # และ CLR ฉันไม่เคยได้ยินเกี่ยวกับ Castle Windsor มาก่อนจนกว่าฉันจะเริ่มมีส่วนร่วมใน Stack Overflow ฉันอ่านคู่มือ "เริ่มต้นใช้งาน" ของ Castle Windsor แล้ว แต่ยังไม่ได้คลิก

สอนเทคนิคใหม่ให้กับสุนัขตัวเก่าและบอกฉันว่าทำไมฉันจึงควรรวม Castle Windsor เข้ากับแอพสำหรับองค์กร


1
อ่านข้อมูลเกี่ยวกับ Inversion of Control มันมีประโยชน์มากสำหรับการช่วยคุณแยกการพึ่งพาซึ่งจะช่วยคุณในการเขียนแบบทดสอบหน่วยสำหรับผู้เริ่มต้น
Dan Csharpster

คำตอบ:


360

Castle Windsor เป็นเครื่องมือในการควบคุม มีคนอื่นชอบมัน

มันสามารถให้วัตถุที่มีการขึ้นต่อกันที่สร้างไว้ล่วงหน้าและแบบใช้สายล่วงหน้าได้ในนั้น กราฟวัตถุทั้งหมดที่สร้างขึ้นผ่านการสะท้อนและการกำหนดค่ามากกว่าตัวดำเนินการ "ใหม่"

เริ่มที่นี่: http://tech.groups.yahoo.com/group/altdotnet/message/10434


ลองนึกภาพคุณมีคลาสส่งอีเมล EmailSender ลองนึกภาพคุณมี WorkflowStepper คลาสอื่น ภายใน WorkflowStepper คุณต้องใช้ EmailSender

คุณสามารถพูดได้เสมอ new EmailSender().Send(emailMessage);

แต่นั่น - การใช้new- สร้าง TIGHT COUPLING ที่ยากต่อการเปลี่ยนแปลง (นี่เป็นเพียงตัวอย่างเล็ก ๆ น้อย ๆ หลังจากทั้งหมด)

แล้วถ้าเช่นนั้นแทนที่จะเป็นเด็กเลวตัวใหม่ใน WorkflowStepper คุณแค่ส่งมันเข้าไปใน Constructor?

ดังนั้นใครก็ตามที่เรียกมันว่าต้องมีอีเมล์ใหม่

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

มันเพิ่งเกิดขึ้น - เพราะมันรู้ว่าอะไรต้องการอะไร

และคุณสามารถเขียนข้อบกพร่องน้อยลงด้วยรหัส DRY ที่ออกแบบมาดีกว่าด้วยวิธีทดสอบและทำซ้ำได้


30
น่ากลัว! เขียนได้ดี! ตอนนี้ฉันตื่นเต้นกับมัน
David Hill

1
ขอบคุณ มีมากขึ้นไปอีก ฉันเลือกตัวอย่างที่เรียบง่ายและเป็นรูปธรรมอย่างเจ็บปวด คุณสามารถใช้อินเทอร์เฟซเพื่อสลับการใช้งาน คุณสามารถกำหนดค่าแอสเซมบลีทั้งหมดได้โดยอัตโนมัติ คุณสามารถระบุอายุการใช้งานเช่นซิงเกิลตันหรือต่อคำขอ http ฯลฯ ดำเนินต่อไป - มันจะเปลี่ยนงานของคุณ
Matt Hinze

6
และเพื่อช่วยให้คน Java: นี่คือ Guice สำหรับ NET ;-)
มาร์ค Renouf

5
ฉันพบว่าจากประสบการณ์ของฉันมันยากที่จะ debug เพราะอ็อบเจ๊กต์เริ่มต้นที่ไหน - ในโครงการขนาดใหญ่ยากที่จะค้นหารากของการเริ่มต้น ฉันชอบวิธีการใช้แบบเก่าnewฉันรู้ว่าทุกอย่างอยู่ที่ไหน ฉันไม่ชอบความคิดในการใช้การสะท้อนและเป็นกล่องดำจริง ๆ รหัสที่เราไม่ได้เป็นเจ้าของและไม่เข้าใจอย่างถ่องแท้
ลุค T โอไบรอัน

1
@ nashwan ใช่ฉันกำลังเขียนทดสอบหน่วย แต่หลักการของ IoC / DI สามารถนำไปใช้โดยไม่ต้อง Castle Windsor หรือกรอบงานบุคคลที่สามใด ๆ สำหรับฉันมันแค่เพิ่มการพึ่งพาอื่นนั่นคือจุดของความคิดเห็นของฉัน ฉันไม่เห็นข้อดีของ Castle Windsor
ลุค T โอไบรอัน

4

Mark Seemann เขียนและหนังสือยอดเยี่ยมเกี่ยวกับ DI (Dependency Injection) ซึ่งเป็นส่วนย่อยของ IOC เขายังเปรียบเทียบตู้คอนเทนเนอร์อีกจำนวนหนึ่ง ฉันไม่สามารถแนะนำหนังสือเล่มนี้ได้มากพอ ชื่อของหนังสือเล่มนี้คือ "การพึ่งพาการฉีดใน. Net" https://www.manning.com/books/dependency-injection-in-dot-net


3

ฉันคิดว่า IoC เป็นก้าวสำคัญในทิศทางที่ถูกต้องบนเส้นทางสู่การเพิ่มผลผลิตและความเพลิดเพลินของทีมพัฒนา (รวมถึง PM, BA an BOs) ช่วยในการแยกข้อกังวลระหว่างผู้พัฒนาและสำหรับการทดสอบ มันให้ความอุ่นใจเมื่อสถาปัตยกรรมที่ช่วยให้มีความยืดหยุ่นเป็นกรอบอาจเข้าและออก

วิธีที่ดีที่สุดในการบรรลุเป้าหมายที่ IoC (CW หรือ Ninject ฯลฯ .. ) นั้นคือการกำจัดการเมือง # 1 และ # 2 เอาความต้องการสำหรับนักพัฒนาที่จะสร้างความเข้าใจที่ผิดเมื่อพัฒนา โซลูชันทั้งสองนี้ดูเหมือนจะไม่เกี่ยวข้องกับ IoC หรือไม่? พวกเขาเป็น :)


3

Castle Windsor Dependency Injection container.หมายความว่าด้วยความช่วยเหลือของสิ่งนี้คุณสามารถฉีดการพึ่งพาของคุณและใช้พวกเขาโดยไม่ต้องสร้างพวกเขาด้วยความช่วยเหลือของคำหลักใหม่ เช่นพิจารณาว่าคุณได้เขียนที่เก็บหรือบริการและคุณต้องการที่จะใช้มันในหลาย ๆ ที่คุณต้องลงทะเบียนบริการ / พื้นที่เก็บข้อมูลของคุณก่อนและคุณสามารถเริ่มใช้งานได้หลังจากฉีดมันในสถานที่ที่ต้องการ คุณสามารถดูบทแนะนำด้านล่างซึ่งฉันได้เรียนรู้การเล่นวินด์เซิร์ฟในปราสาท

ลิงค์

หวังว่ามันจะช่วยคุณ


1

ใส่เพียง ลองนึกภาพว่าคุณมีคลาสที่ฝังอยู่ในรหัสของคุณที่ต้องการค่าการกำหนดค่าง่ายๆเพื่อทำงาน นั่นหมายความว่าทุกสิ่งที่สร้างอินสแตนซ์ของคลาสนั้นจำเป็นต้องได้รับการอ้างอิงเหล่านั้นดังนั้นคุณมักจะต้องทำการรีโหลดหรือโหลดคลาสอีกครั้งเพื่อส่งค่าคอนฟิเกอเรชันให้น้อยลง

ดังนั้นคลาสจำนวนมากจะถูกเปลี่ยนโดยไม่จำเป็นคุณมัดค่า config ไว้ในคลาส config ขนาดใหญ่ซึ่งแย่มาก ...

IoC ช่วยให้ชั้นเรียนของคุณได้รับการพึ่งพาโดยไม่ต้องยุ่งยากและจัดการอายุการใช้งานของอินสแตนซ์ได้ชัดเจนยิ่งขึ้นเช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.