02. Dependencies Injection using Effect
Install Effect
น่าจะติดตั้งกันไปแล้วแต่ทวนอีกทีละกัน
pnpm add effectDependencies Inject using Effect Layer
Dependencies inject คือ design pattern แบบหนึ่ง โดยหลักการคือเราจะรับ service อะไรบางอย่างจากภายนอกเข้ามาใช้งาน แทนที่จะ
สร้าง service ขึ้นมาใช้งานเองจากภายใน
ทำให้เราสร้าง service แค่ที่เดียว แล้วส่งไปให้กับส่วนอื่นๆที่ต้องการใช้งาน
หรืออาจจะเปลี่ยนวิธีการทำงาน แต่ว่ารับ input หน้าตาเหมือนเดิม ส่ง output หน้าตาเหมือนเดิม
ก่อนหน้านี้เราใช้วิธีการทำ Dependencies inject แบบ passing service as a argument ไปที่ function
ตอนนี้เราจะใช้ Effect ละ ซึ่ง Effect สามารถทำให้เราสร้าง Dependency ได้ง่ายๆ และเรียกใช้ได้ง่ายๆ ไม่ต้อง passing as a argument แล้วหรือจะยังทำเหมือนเดิมก็ได้เลือกได้ และที่ Effect type ก็จะมีบอกชัดเจนเลยว่า function ที่เราสร้างต้องการ Dependencies อะไรบ้าง ก่อนที่จะสั่งรัน program ได้
ใน Effect มี default dependencies เตรียมมาให้ใช้บางส่วนแล้ว เช่น
Clock | ConfigProvider | Console | Random | Tracer การใช้ Dependencies เหล่านี้ไม่จำเป็นต้อง inject เอง Effect จะ inject ให้เราเอง
ใน Effect เราจะสร้าง Service ที่ใช้สำหรับ inject ผ่าน Context module
พอสร้างแล้วเราจะเรียกมันว่า Layer เราสามารถเอา Layer ไปใช้ที่ Service อื่นๆได้ โดยที่ Service ที่เป็นคนเรียกใช้ไม่ต้องรู้ว่า
Layer ที่นำมาใช้มันทำงานยังไง
เช่นเราสร้าง Context ขึ้นมาชื่อว่า LayerA แล้วก็สร้าง LayerB ด้วย โดย LayerB เอา LayerA มาใช้งาน
แล้วถ้ามี LayerC เอา LayerB ไปใช้งานอีกทอดนึง ทำให้ก่อนที่เราจะรันโปรแกรม เราใช้แค่ LayerC อย่างเดียว แต่ Effect จะไม่ยอมให้เรารัน มันจะบอกว่าต้องการ Layer อะไรบ้าง เราต้องสร้าง LayerA แล้วนำไป injdect ที่ LayerB
แล้วก็เอา LayerB inject ไปที่ LayerC พอทุกอย่างครบแล้ว Effect จะยอมทำงานให้เราแล้ว
ทั้งหมดนี้ Effect ใช้ Typescript compiler ในการช่วยบอกเราว่ายังขาด Layers อะไรอยู่ ในระดับ Type Level