มีดที่ไม่มีด้ามจับที่ดี มันจะใช้งานยากฉันใด
Dagger จึงต้องมี Hilt ฉันนั้น !!
ทางทีมพัฒนา Android ได้ปล่อย Hilt library ให้ใช้งาน
มาดูกันหน่อยว่า Dagger Hilt มีเป้าหมายและทำงานอย่างไร ?
และแตกต่างจาก Dagger Android อย่างไร ?
เป้าหมายหลัก ๆ ของ Hilt ประกอบไปด้วย
- ทำให้การใช้งานง่ายขึ้น ซึ่งทำการ gernerate Dagger component ต่าง ๆ และ auto-inject ไปยัง Android class ให้เอง เหมือนกับ Spring Framework เลย
- ทำให้การจัดการ component ต่าง ๆ รวมทั้งการกำหนด scope การทำงานในรูปแบบที่เป็นมาตรฐาน
- ทำให้ code อ่านง่ายและเข้าใจง่ายขึ้น
- ลด code ขยะ ๆ ออกไปเยอะ
- ทำให้คนเริ่มต้นใช้งาน Dagger สบายขึ้น
- ที่ขาดไปไม่ได้คือ ช่วยให้การทดสอบง่ายขึ้นอีกด้วย เพราะว่า Hilt ทำการ generate Dagger component ที่เหมือนนกับ production ให้เลย และเราสามารถเปลี่ยนแปลงได้เองอีกด้วย เป็นส่วนที่ชอบมาก ๆ
ปล. เป็นการ generate code สำหรับสิ่งที่จะ generate code ต่อไป
อาจจะงง ๆ หน่อย แต่ก็พอเข้าใจได้
และแน่นอนว่ามีใน AndroidX package หรือ Jetpack นั่นเอง
ทำให้ทำงานร่วมกับพวก ViewMpdel และ WorkManager ได้
เพื่อความเข้าใจมาเริ่มต้นใช้งานกันหน่อย
เริ่มจากการ configuration เพื่อใช้งาน Hilt ใน Android project
เพิ่มที่ไฟล์ build.gradle ของ project
[gist id="077f1e6f37fa3c75379ec1ee7cae25c9" file="build.gradle"]และเพิ่ม dependency ต่าง ๆ ใน app/build.gradle
[gist id="077f1e6f37fa3c75379ec1ee7cae25c9" file="app.build.gradle"]มาลองใช้ความสามารถของ Hilt กันบ้าง ประกอบไปด้วย
- Dependency Injection ซึ่งสามารถนำ class ต่าง ๆ มาใช้งานใน Android class ได้เลย
- สามารถกำหนด scope ของ instance ต่าง ๆ ได้
- จัดการ Module ใน Hilt ทั้ง Provide, Scope และ Binding
- การทดสอบ ซึ่งทาง Hilt ได้เตรียม HiltAnddroidTest มาให้ใช้งาน จะทำการสร้าง Hilt component ของการทดสอบมาให้ รวมทั้งมี HiltAndroidRule สำหรับการจัดการ ccomponent และ state และ inject เข้ามาได้ในแต่ละ test
มาดูตัวอย่างง่าย ๆ ของ Depednency Injection กัน
เริ่มที่ class Application ของ project เขียนสั้น ๆ แบบนี้
เพื่อให้สามารถใช้งาน Hilt ได้ เป็นการสร้าง Container กลางไว้
สำหรับสร้าง instance ต่าง ๆ ไว้
รวมทั้งสามารถใช้งาน Depenendcy Injeccttion ได้แล้ว
จากนั้นทำการสร้าง class ทำงานนิดหน่อย
ในตัวอย่างคือ DateFormatter ดังนี้
[gist id="077f1e6f37fa3c75379ec1ee7cae25c9" file="DateFormatter.kt"]จากนั้นใน class Activity/Fragment สามารถใช้งานได้
ด้วยการใส่ @AndroidEntryPoint เข้ามา
เพื่อให้ Hilt จัดการการสร้างแและใช้งาน instance ให้
แน่นอนว่าสาามารถ Inject Dateformatter มาใช้งานได้เลย
ซึ่งการ Inject แบบนี้จะเรียกว่า Field Injection นั่นเอง ดังนี้
เพียงเท่านี้ก็สามารถใช้งาน Hilt แบบง่าย ๆ ได้แล้ว
แต่ยังมีความสามารถอื่น ๆ อีกเพียบนะครับ ลองใช้งานกันดู
ข้อมูลเพิ่มเติม