IOC เวลารวบรวม


11

มีใครเริ่มโครงการที่จะทำ IOC ในเวลารวบรวม (อาจจะใช้ Roslyn หรือ Linq MethodInfo ปล่อย)?

ประสบการณ์ของฉันกับคอนเทนเนอร์ของ IOC นั้นยอดเยี่ยมมากโดยมีปัญหาเล็ก ๆ น้อย ๆ

  1. คอนเทนเนอร์ IOC จำนวนมากเริ่มทำงานช้าลงเนื่องจากตรรกะการแก้ปัญหาส่วนใหญ่เกิดขึ้นที่นี่
  2. บ่อยครั้งที่ยากที่จะตรวจสอบให้แน่ใจว่าการแก้ปัญหาเป็นไปได้เนื่องจากการรวบรวมไม่ทำให้แน่ใจได้ว่าตัวสร้างสามารถเรียกได้อีกต่อไป
  3. บ่อยครั้งที่คอนเทนเนอร์ของ IOC เพิ่มโอเวอร์เฮดขนาดเล็กให้กับรันไทม์ (บางอันไม่ได้เล็กแม้แต่บางอันที่เริ่มทำงานเร็วขึ้นอย่างรวดเร็ว)

สำหรับฉันแล้วดูเหมือนว่าทางออกที่ดีที่สุดคือการเพิ่มขั้นตอนการคอมไพล์ให้กับ build chain ที่เพิ่มคลาส Factory แทน IOC

มีใครทำแบบนี้มาก่อนหรือไม่ ถ้าไม่ทำไมล่ะ

คำตอบ:


4

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

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


ใช่ฉันรู้ว่ามันเป็นไปได้ แต่ฉันยังไม่เห็นคอนเทนเนอร์ IoC ที่ทำ นอกจากนี้ฉันยังได้ตั้งข้อสังเกตว่าแนวโน้มปัจจุบันน่าจะเป็นการลงทะเบียนในโค้ด (API ที่คล่องแคล่ว) ระบุว่าฉันกำลังพิจารณาเขียนคอนเทนเนอร์ IoC กล่าว
ArTs

ฉันดูเหมือนจะจำได้ว่าฮิโระ ( github.com/philiplaureano/Hiro ) อาจทำสิ่งต่าง ๆ ในเวลารวบรวม
lzcd

2
"แต่ด้วยการทำเช่นนี้คุณกำลังลบข้อได้เปรียบที่สำคัญอย่างหนึ่งของ IoC: ความสามารถในการเปลี่ยนวิธีการรวมตัวกันโดยไม่ต้องคอมไพล์แอปพลิเคชันใหม่ทั้งหมด" สำหรับฉันแล้วดูเหมือนว่าการใช้สิ่งนี้กับทั้งแอปพลิเคชันนั้นเกินความจริง คุณเปลี่ยนทุกส่วนของแอปพลิเคชันเป็นปลั๊กอิน นอกจากนี้เทคนิคทั้งสองควรอยู่ร่วมกันได้ - ไม่มีเหตุผลที่คุณไม่สามารถเชื่อมต่อส่วนประกอบบางอย่างในเวลาคอมไพล์และบางอย่างในขณะทำงาน
Doval

ฉันไม่เห็นว่ามันเป็นประโยชน์อย่างมาก ในบริบทใดที่คุณแทนที่ส่วนประกอบในรันไทม์อย่างสมบูรณ์ การกำหนดค่าการใช้งานบางกรณีอาจจะ?
andyczerwonka

4

Dagger สำหรับ Java / Androidทำเช่นนั้น มันเสียสละเวทย์มนตร์บางอย่าง (เช่นของ Guice) เพื่อให้ประสบการณ์ codegen เวลารวบรวมเกือบสมบูรณ์รวมถึงการแปลงข้อผิดพลาดรันไทม์ส่วนใหญ่เป็นข้อผิดพลาดในการรวบรวม

คงจะเท่ห์ใน. NET ด้วย

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