นี้คล้ายกับคำตอบ upvoted แต่ฉันต้องการคิดออกดัง - บางทีคนอื่นอาจเห็นสิ่งนี้ด้วย
คลาสสิค OO ใช้ตัวสร้างเพื่อกำหนดสาธารณะ "เริ่มต้น" สัญญาสำหรับผู้บริโภคในชั้นเรียน (ซ่อนรายละเอียดการใช้งานทั้งหมด; การห่อหุ้ม aka) สัญญานี้สามารถมั่นใจได้ว่าหลังจาก instantiation คุณมีวัตถุที่พร้อมใช้งาน (เช่นไม่มีขั้นตอนการเริ่มต้นเพิ่มเติมที่ต้องจดจำ (ผู้ใช้ลืม) โดยผู้ใช้
(คอนสตรัค) DI ปฏิเสธอย่างไม่อาจแยก encapsulation โดยรายละเอียดการดำเนินการตกเลือดผ่านอินเทอร์เฟซตัวสร้างสาธารณะนี้ ตราบใดที่เรายังคงพิจารณาตัวสร้างสาธารณะที่รับผิดชอบในการกำหนดสัญญาการเริ่มต้นสำหรับผู้ใช้เราได้สร้างการละเมิด encapsulation ที่น่ากลัว
ตัวอย่างเชิงทฤษฎี:
Class Fooมี 4 วิธีและต้องการจำนวนเต็มสำหรับการกำหนดค่าเริ่มต้นดังนั้น Constructor ของมันดูเหมือนว่าFoo (ขนาดใหญ่)และเป็นที่ชัดเจนสำหรับผู้ใช้ Class Foo ในทันทีที่พวกเขาต้องเตรียมขนาดในการเริ่มต้นเพื่อให้ Foo ทำงาน
สมมติว่าการติดตั้ง Foo นี้โดยเฉพาะอาจต้องใช้IWidgetเพื่อทำงาน การสร้าง Constructor ของการพึ่งพานี้จะให้เราสร้าง Constructor เช่นFoo (ขนาด int, วิดเจ็ต IWidget)
สิ่งที่ทำให้ฉันหงุดหงิดเกี่ยวกับเรื่องนี้คือตอนนี้เรามีคอนสตรัคเตอร์ที่ผสมข้อมูลการเริ่มต้นกับการพึ่งพา - อินพุตหนึ่งเป็นที่สนใจของผู้ใช้งานของคลาส ( ขนาด ), อีกอันคือการพึ่งพาภายในที่ทำหน้าที่สร้างความสับสนให้ผู้ใช้เท่านั้น detail ( วิดเจ็ต )
พารามิเตอร์ขนาดไม่ใช่การพึ่งพา - เป็นค่าเริ่มต้นต่ออินสแตนซ์ที่ง่าย IoC มีความน่าเชื่อถือสำหรับการอ้างอิงภายนอก (เช่นวิดเจ็ต) แต่ไม่ใช่สำหรับการเริ่มต้นสถานะภายใน
ยิ่งไปกว่านั้นถ้าเครื่องมือมีความจำเป็นสำหรับ 2 ใน 4 วิธีในคลาสนี้เท่านั้น ฉันอาจจะเกิดค่าใช้จ่ายในการสร้างอินสแตนซ์สำหรับ Widget ถึงแม้ว่ามันอาจไม่ได้ใช้!
วิธีการประนีประนอม / กระทบยอดนี้
วิธีหนึ่งคือการสลับไปยังส่วนต่อประสานเฉพาะเพื่อกำหนดสัญญาการดำเนินงาน และยกเลิกการใช้งานคอนสตรัคเตอร์โดยผู้ใช้ เพื่อให้สอดคล้องกันวัตถุทั้งหมดจะต้องเข้าถึงผ่านอินเตอร์เฟสเท่านั้นและอินสแตนซ์ผ่านโปรแกรมแก้ไขรูปแบบบางรูปแบบเท่านั้น (เช่นคอนเทนเนอร์ IOC / DI) ภาชนะเท่านั้นที่จะยกตัวอย่างสิ่งต่าง ๆ
ที่ดูแลการพึ่งพา Widget แต่เราจะเริ่มต้น "ขนาด" โดยไม่ต้องหันไปใช้วิธีการเริ่มต้นแยกต่างหากในส่วนต่อประสาน Foo ได้อย่างไร การใช้โซลูชันนี้ทำให้เราสูญเสียความสามารถในการตรวจสอบให้แน่ใจว่าอินสแตนซ์ของ Foo นั้นเริ่มต้นอย่างสมบูรณ์เมื่อคุณได้รับอินสแตนซ์ คนเกียจคร้านเพราะฉันชอบความคิดและความเรียบง่ายของการฉีดคอนสตรัคเตอร์
ฉันจะบรรลุการกำหนดค่าเริ่มต้นที่รับประกันในโลก DI นี้ได้อย่างไรเมื่อการเริ่มต้นเป็นมากกว่าการพึ่งพาจากภายนอกเท่านั้น