02. Dependencies Injection using Effect
Install Effect
น่าจะติดตั้งกันไปแล้วแต่ทวนอีกทีละกัน
Dependencies 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