Sunrabbit

สร้างเฟรมเวิร์กระดับ DI ด้วย Node.js แม้จะเป็นมือใหม่

สร้าง: 2024-11-08

สร้าง: 2024-11-08 14:02

เมื่อพัฒนาเซิร์ฟเวอร์ด้วย Node.js มักจะได้รับแรงดึงดูดจาก Spring มากมาย

เพราะมันมีโครงสร้างเป็นระบบ มีระเบียบ และยากที่จะเจาะระบบได้ง่ายๆ


ดังนั้น ในฝั่ง Node.js จึงเกิดเฟรมเวิร์กชื่อ Nest.js ขึ้นมา

นั่นคือ ความปรารถนาอย่างมากมายที่อยากจะพัฒนาเซิร์ฟเวอร์ในรูปแบบที่มีโครงสร้างเหมือน Spring


แต่ DI ของ Spring นั้นใช้ Reflection ในขณะรันไทม์เพื่อให้การสนับสนุนการดำเนินการ DI ในระดับภาษา

Dotnet ก็เช่นกัน โดยใช้ Attribute เป็นพื้นฐานในการติดตามและดำเนินการ DI ด้วย Reflection


แล้ว Nest.js ทำการ DI ได้อย่างไร?

Spring และ Dotnet มีภาษาพื้นฐานเป็นภาษาคอมไพล์เลอร์ จึงสนับสนุน Reflection ในระดับภาษาได้ แต่...

ecma script เป็นเพียงภาษาอินเทอร์พรีเตอร์ธรรมดาๆ


ด้านล่างนี้เป็นตัวอย่างหนึ่งจากบทช่วยสอนของ Nest.js


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


ทางออกอยู่ที่สเปคของภาษา

Reflect

โชคดีที่ในระดับภาษา มีฟังก์ชันที่สร้างขึ้นมาเพื่อให้สามารถเพิ่มเมตาข้อมูลลงในแต่ละออบเจ็กต์ได้

สร้างเฟรมเวิร์กระดับ DI ด้วย Node.js แม้จะเป็นมือใหม่


เป็นเพียงฟังก์ชันง่ายๆ ที่เพิ่มและดึงเมตาข้อมูลจากออบเจ็กต์


ดังนั้น TypeScript จึงคิดว่า...

ถ้าอย่างนั้น เราจะใส่ข้อมูลประเภทลงในเมตาข้อมูลเมื่อคอมไพล์คลาสไหม?


ดังนั้น TypeScript จึงบันทึกข้อมูลของค่าพารามิเตอร์ที่จำเป็นสำหรับตัวสร้างลงใน Reflect ในทุกๆ ที่ที่มีการใช้คลาสเดโคเรเตอร์

สร้างเฟรมเวิร์กระดับ DI ด้วย Node.js แม้จะเป็นมือใหม่

ไม่มีการแปลงหรือเวทมนตร์ดำใดๆ เกี่ยวข้องเลย เป็นเพียงฟังก์ชันของคอมไพล์เลอร์ TypeScript เท่านั้น


เมื่อข้อมูลประเภทของพารามิเตอร์ที่จำเป็นสำหรับตัวสร้างอยู่ในเมตาข้อมูลของคลาสแล้ว

เราสามารถเรียกคลาสและรู้ประเภทได้ ทำให้สามารถใส่ค่าได้อย่างถูกต้อง


สามารถดูการใช้งานได้จาก NestJS แต่เนื่องจากมันซับซ้อนเกินไป ผมจึงขอแนะนำไลบรารี่อื่นๆ


ไลบรารี่นี้พัฒนาโดย microsoft โค้ดจึงค่อนข้างเรียบร้อย

ขอแนะนำให้ลองดู และขอจบการเขียนบทความไว้เพียงเท่านี้

ความคิดเห็น0

[Java] แนวคิดและวิธีการใช้งาน ReflectionReflection ใน Java เป็น API ที่ช่วยให้สามารถสร้างออบเจ็กต์ เข้าถึงฟิลด์ และเมธอดผ่านข้อมูลของคลาสที่โหลดอยู่ในฮีป โดยใช้ใน Spring Framework สำหรับการสร้างออบเจ็กต์และการฉีด Dependency
제이온
제이온
제이온
제이온

April 25, 2024

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

May 3, 2025

[Effective Java] รายการที่ 6: หลีกเลี่ยงการสร้างออบเจ็กต์ที่ไม่จำเป็นการสร้างออบเจ็กต์ที่ไม่จำเป็นนั้นนำไปสู่การสิ้นเปลืองหน่วยความจำ ดังนั้น สำหรับออบเจ็กต์ เช่น สตริง หรือบูลีน ควรใช้ลิเทอรัลหรือเมธอดจากโรงงานแบบคงที่แทน
제이온
제이온
제이온
제이온

April 28, 2024

[สปริง] Filter, Interceptor, Argument Resolver คืออะไร?บทความนี้จะอธิบายถึงบทบาท วิธีการใช้งาน และความแตกต่างของ Filter, Interceptor และ Argument Resolver ในสปริง Filter และ Interceptor มีหน้าที่จัดการกับการประมวลผลก่อนและหลังการร้องขอ ขณะที่ Argument Resolver จะทำหน้าที่ประมวลผลอาร์กิวเมนต์ของคอนโทรลเลอร์
제이온
제이온
제이온
제이온

April 27, 2024

[Effective Java] รายการที่ 2: พิจารณาการใช้ Builder เมื่อมีพารามิเตอร์ใน Constructor จำนวนมากการใช้รูปแบบ Builder เมื่อมีพารามิเตอร์ใน Constructor จำนวนมากสามารถช่วยเพิ่มความสามารถในการอ่านและความเสถียรได้ รูปแบบ Builder มีประสิทธิภาพมากกว่ารูปแบบ Java Beans หรือรูปแบบ Constructor แบบขั้นบันได
제이온
제이온
제이온
제이온

April 27, 2024

เรื่องราวการพัฒนาโครงการ LegiNote ตอนที่ 2 - สแตกเทคโนโลยีและเวิร์กเกอร์บทความตอนที่สองของเรื่องราวการพัฒนาโครงการ LegiNote ซึ่งจะกล่าวถึงการพัฒนาเวิร์กเกอร์โดยใช้ภาษา Go เนื้อหาครอบคลุมการนำไปใช้ในการรวบรวมและอัปเดตข้อมูล รวมถึงการออกแบบโครงสร้างของโครงการ
statpan
statpan
statpan
statpan

August 20, 2024