มีการถกเถียงกันอย่างต่อเนื่องเกี่ยวกับวิธีที่ดีที่สุดในการฉีดการพึ่งพา
การตัดแบบสปริงดั้งเดิมนั้นทำให้วัตถุเป็นชิ้นเรียบแล้วฉีดการพึ่งพาผ่านวิธีเซ็ตเตอร์
แต่จากนั้นผู้คนจำนวนมากยืนยันว่าการฉีดการพึ่งพาผ่านพารามิเตอร์คอนสตรัคเตอร์เป็นวิธีที่ถูกต้องในการทำ
จากนั้นเมื่อเร็ว ๆ นี้เมื่อใช้การสะท้อนกลับพบบ่อยขึ้นการกำหนดค่าของสมาชิกส่วนตัวโดยตรงโดยไม่ต้องตั้งค่าหรือคอนสตรัคเตอร์คอนสตรัคต์
ดังนั้นคอนสตรัคเตอร์แรกของคุณจึงสอดคล้องกับวิธีที่สองในการฉีดพึ่งพา ช่วยให้คุณทำสิ่งที่ดีเช่นการฉีด mocks สำหรับการทดสอบ
แต่ตัวสร้างไม่มีอาร์กิวเมนต์มีปัญหานี้ เนื่องจากเป็นการยกระดับชั้นเรียนการดำเนินการให้รวดเร็วขึ้นPaypalCreditCardProcessor
และDatabaseTransactionLog
จะสร้างการพึ่งพาอย่างหนักและรวบรวมใน PayPal และฐานข้อมูล มันจะรับผิดชอบในการสร้างและกำหนดค่าทรีการพึ่งพาทั้งหมดให้ถูกต้อง
ลองนึกภาพว่าหน่วยประมวลผล PayPay เป็นระบบย่อยที่ซับซ้อนมากและยังมีห้องสมุดสนับสนุนจำนวนมากอีกด้วย ด้วยการสร้างการพึ่งพาเวลาคอมไพล์ในคลาสการใช้งานนั้นคุณกำลังสร้างลิงก์ที่ไม่สามารถแตกได้ไปยังแผนผังการพึ่งพาทั้งหมด ความซับซ้อนของกราฟวัตถุของคุณเพิ่งเพิ่มขึ้นตามลำดับความสำคัญอาจเป็นสองระดับ
ไอเท็มเหล่านั้นจำนวนมากในแผนผังการพึ่งพาจะมีความโปร่งใส แต่ส่วนมากจะต้องมีอินสแตนซ์ ราคาต่อรองคุณจะไม่สามารถยกตัวอย่างกPaypalCreditCardProcessor
.
นอกเหนือจากการสร้างอินสแตนซ์วัตถุแต่ละชิ้นจะต้องการคุณสมบัติที่ใช้จากการกำหนดค่า
หากคุณมีเพียงการพึ่งพาส่วนต่อประสานและอนุญาตให้โรงงานภายนอกสร้างและฉีดการพึ่งพาพวกเขาจะตัดการพึ่งพาต้นกำเนิด PayPal ทั้งหมดและความซับซ้อนของรหัสของคุณจะหยุดที่ส่วนต่อประสาน
มีประโยชน์อื่น ๆ เช่นการระบุคลาสการใช้งานที่ในการกำหนดค่า (เช่นที่รันไทม์มากกว่าเวลารวบรวม) หรือมีข้อกำหนดการพึ่งพาแบบไดนามิกมากขึ้นที่แตกต่างกันพูดตามสภาพแวดล้อม (ทดสอบการรวมการผลิต)
ตัวอย่างเช่นสมมติว่า PayPalProcessor มีวัตถุที่ต้องพึ่งพา 3 รายการและการอ้างอิงแต่ละรายการนั้นมีอีกสองรายการ และวัตถุเหล่านั้นทั้งหมดจะต้องดึงคุณสมบัติจากการกำหนดค่า รหัสตามที่เป็นจะรับผิดชอบในการสร้างสิ่งที่ออกการตั้งค่าคุณสมบัติจากการกำหนดค่า ฯลฯ - ทั้งหมดกังวลว่ากรอบ DI จะดูแล
ในตอนแรกอาจดูเหมือนไม่ชัดเจนว่าคุณกำลังป้องกันตัวเองจากการใช้กรอบ DI แต่มันเพิ่มขึ้นและกลายเป็นความเจ็บปวดอย่างเห็นได้ชัดเมื่อเวลาผ่านไป (ฉันพูดจากประสบการณ์ของการพยายามทำมันอย่างหนัก)
...
ในทางปฏิบัติแม้แต่สำหรับโปรแกรมเล็ก ๆ ฉันพบว่าฉันเขียนลงในรูปแบบ DI และแบ่งชั้นเรียนออกเป็นคู่ใช้งาน / โรงงาน นั่นคือถ้าฉันไม่ได้ใช้เฟรมเวิร์ก DI เช่น Spring ฉันจะรวมคลาสโรงงานง่ายๆไว้ด้วยกัน
นั่นคือการแยกข้อกังวลออกเพื่อให้ชั้นของฉันสามารถทำสิ่งนั้นได้และชั้นโรงงานต้องรับผิดชอบในการสร้างและกำหนดค่าสิ่งของ
ไม่ใช่วิธีที่จำเป็น แต่เป็น FWIW
...
โดยทั่วไปรูปแบบ DI / อินเตอร์เฟสจะลดความซับซ้อนของรหัสของคุณโดยทำสองสิ่ง:
ยิ่งไปกว่านั้นเนื่องจากการสร้างอินสแตนซ์และการกำหนดค่าวัตถุเป็นงานที่ค่อนข้างคุ้นเคยโครงงาน DI สามารถบรรลุการประหยัดจากขนาดได้ผ่านสัญกรณ์มาตรฐานและการใช้เทคนิคเช่นการสะท้อน การกระจัดกระจายความกังวลแบบเดียวกันเหล่านั้นในชั้นเรียนจบลงด้วยการเพิ่มความยุ่งเหยิงมากกว่าที่คิด