วัตถุประสงค์ของ IOC Containers คืออะไร? เหตุผลที่รวมกันสามารถทำให้เป็นดังต่อไปนี้:
เมื่อใช้หลักการพัฒนา OOP / SOLID การพึ่งพาการฉีดจะทำให้เกิดความยุ่งเหยิง ไม่ว่าคุณจะมีจุดเริ่มต้นระดับสูงสุดที่จัดการการพึ่งพาสำหรับหลายระดับต่ำกว่าตนเองและผ่านการอ้างอิงซ้ำผ่านการก่อสร้างซ้ำหรือคุณมีรหัสที่ซ้ำกันในรูปแบบโรงงาน / ผู้สร้างและอินเตอร์เฟสที่สร้างการพึ่งพาตามที่คุณต้องการ
ไม่มีวิธี OOP / SOLID ในการดำเนินการนี้และมีรหัสสวยมาก
หากข้อความก่อนหน้านั้นเป็นจริงแล้วตู้คอนเทนเนอร์ IOC จะทำอย่างไร เท่าที่ฉันรู้พวกเขาไม่ได้ใช้เทคนิคที่ไม่รู้จักบางอย่างที่ไม่สามารถทำได้ด้วยตนเอง DI ดังนั้นการอธิบายเพียงอย่างเดียวคือ IOC Containers ทำลายหลักการ OOP / SOLID โดยการใช้อ็อบเจกต์ส่วนตัวแบบคงที่
ตู้ IOC ทำลายหลักการต่อไปนี้หรือไม่? นี่เป็นคำถามจริงเนื่องจากฉันมีความเข้าใจที่ดี แต่มีความรู้สึกว่ามีคนอื่นมีความเข้าใจที่ดีขึ้น:
- การควบคุมขอบเขต ขอบเขตคือเหตุผลสำหรับเกือบทุกการตัดสินใจของฉันในการออกแบบรหัสของฉัน บล็อกท้องถิ่นโมดูลคงที่ / ทั่วโลก ขอบเขตควรชัดเจนมากที่สุดเท่าที่ระดับบล็อกและน้อยที่สุดที่คงที่ที่สุด คุณควรเห็นการประกาศการสร้างอินสแตนซ์และการสิ้นสุดวงจรชีวิต ฉันเชื่อมั่นในภาษาและ GC ในการจัดการขอบเขตตราบใดที่ฉันชัดเจนด้วย จากการวิจัยของฉันฉันพบว่า IOC Containers ตั้งค่าการพึ่งพาส่วนใหญ่หรือทั้งหมดเป็นแบบคงที่และควบคุมพวกมันผ่านการใช้งาน AOP เบื้องหลัง ดังนั้นจึงไม่มีอะไรโปร่งใส
- encapsulation จุดประสงค์ของการห่อหุ้มคืออะไร? ทำไมเราควรรักษาสมาชิกส่วนตัวเอาไว้? ด้วยเหตุผลที่ปฏิบัติได้จริงมันคือผู้ดำเนินการของ API ของเราไม่สามารถทำลายการใช้งานได้โดยการเปลี่ยนสถานะ (ซึ่งควรได้รับการจัดการโดยเจ้าของคลาส) แต่ด้วยเหตุผลด้านความปลอดภัยมันจึงไม่สามารถเกิดการฉีดขึ้นมาได้ทันที่รัฐสมาชิกของเราและหลีกเลี่ยงการตรวจสอบและควบคุมชั้นเรียน ดังนั้นสิ่งใด (กรอบการเยาะเย้ยกรอบหรือกรอบ IOC) อย่างใดที่ฉีดรหัสก่อนที่จะรวบรวมเวลาเพื่อให้การเข้าถึงจากภายนอกให้กับสมาชิกส่วนตัวมีขนาดใหญ่มาก
- หลักการ Single รับผิดชอบ บนพื้นผิวภาชนะบรรจุของ IOC ดูเหมือนจะทำให้ทุกอย่างสะอาดขึ้น แต่ลองจินตนาการว่าคุณจะทำสิ่งเดียวกันให้สำเร็จได้อย่างไรโดยไม่ต้องมีกรอบตัวช่วย คุณจะมีคอนสตรัคเตอร์ที่มีการอ้างอิงเป็นโหลหรือมากกว่านั้นซึ่งไม่ได้แปลว่าครอบคลุมด้วยตู้คอนเทนเนอร์ IOC มันเป็นสิ่งที่ดี! มันเป็นสัญญาณที่บ่งบอกถึงรหัสของคุณอีกครั้งและติดตาม SRP
เปิด / ปิด เช่นเดียวกับ SRP ไม่ใช่ Class-Only (ฉันใช้ SRP ลงไปที่บรรทัดความรับผิดชอบเดี่ยวและวิธีการเพียงอย่างเดียว) Open / Closed ไม่ได้เป็นเพียงทฤษฎีระดับสูงเท่านั้นที่จะไม่เปลี่ยนรหัสของคลาส เป็นการฝึกทำความเข้าใจเกี่ยวกับการกำหนดค่าโปรแกรมของคุณและควบคุมสิ่งที่ได้รับการเปลี่ยนแปลงและสิ่งที่เพิ่มขึ้น ภาชนะบรรจุ IOC สามารถเปลี่ยนวิธีการทำงานของชั้นเรียนของคุณทั้งหมดบางส่วนเพราะ:
รหัสหลักไม่ได้ทำการตัดสินใจของการสลับการพึ่งพาการกำหนดค่ากรอบคือ
ข ขอบเขตสามารถเปลี่ยนแปลงได้ในเวลาที่ไม่ได้ควบคุมโดยสมาชิกที่โทร แต่จะถูกกำหนดภายนอกโดยกรอบงานคงที่
ดังนั้นการกำหนดค่าของคลาสไม่ได้ปิดจริง ๆ มันจะเปลี่ยนแปลงตัวเองตามการกำหนดค่าของเครื่องมือของบุคคลที่สาม
เหตุผลนี้เป็นคำถามเพราะฉันไม่จำเป็นต้องเป็นผู้เชี่ยวชาญของภาชนะบรรจุทั้งหมดของ IOC และในขณะที่ความคิดของ IOC Container เป็นสิ่งที่ดีพวกเขาดูเหมือนจะเป็นส่วนหน้าที่ครอบคลุมการใช้งานที่ไม่ดี แต่เพื่อให้บรรลุการควบคุมขอบเขตภายนอกการเข้าถึงสมาชิกส่วนตัวและการโหลด Lazy สิ่งที่น่าสงสัยที่ไม่น่าสงสัยมากมายก็ต้องดำเนินต่อไป AOP นั้นยอดเยี่ยม แต่วิธีที่ทำได้ผ่าน IOC Containers ก็เป็นที่น่าสงสัยเช่นกัน
ฉันสามารถเชื่อถือ C # และ. NET GC เพื่อทำสิ่งที่ฉันคาดหวัง แต่ฉันไม่สามารถไว้วางใจแบบเดียวกันนี้ได้ในเครื่องมือของบุคคลที่สามซึ่งกำลังเปลี่ยนรหัสที่คอมไพล์ของฉันเพื่อแก้ไขปัญหากับสิ่งที่ฉันไม่สามารถทำได้ด้วยตนเอง
EG: Entity Framework และ ORM อื่น ๆ สร้างวัตถุที่มีการพิมพ์อย่างมากและแมปไปยังเอนทิตีฐานข้อมูลรวมถึงมีฟังก์ชั่นพื้นฐานจานจานหม้อไอน้ำเพื่อดำเนินการ CRUD ทุกคนสามารถสร้าง ORM ของตนเองและทำตามหลักการ OOP / SOLID ต่อไปได้ด้วยตนเอง แต่กรอบเหล่านั้นช่วยเราได้ดังนั้นเราจึงไม่ต้องคิดค้นวงล้อใหม่ทุกครั้ง ในขณะที่ IOC ดูเหมือนว่าช่วยให้เราทำงานโดยมีหลักการ OOP / SOLID และครอบคลุมมัน
IOC
และExplicitness of code
เป็นสิ่งที่ฉันมีปัญหา แมนนวล DI สามารถกลายเป็นงานที่น่าเบื่อได้ง่าย แต่อย่างน้อยมันก็ทำให้การไหลของโปรแกรมชัดเจนขึ้นเองในที่เดียว - "คุณได้สิ่งที่คุณเห็นคุณเห็นว่าคุณได้อะไร" ในขณะที่การผูกและการประกาศคอนเทนเนอร์ของ IOC สามารถกลายเป็นโปรแกรมคู่ขนานที่ซ่อนอยู่ได้อย่างง่ายดาย