فرشته ناجی
فرشته ناجی
خواندن ۲ دقیقه·۳ سال پیش

کُدلَب استفاده از دَگِر در برنامه اندرویدی (5-استفاده از Scope)

این نوشتار مربوط به بخش پنجم از کُدلب آموزشی استفاده از Dagger در پروژه اندرویدی به زبان کاتلین هست و می‌تونید بخش قبلی رو از اینجا بخونید.

استفاده از Scoping یا محدوده

Ice cream scoop or annotation scope?
Ice cream scoop or annotation scope?


گاهی اوقات شما به چند دلیل می‌خواهید که از یک وابستگی در کامپوننت instance یکسانی داشته باشید:

1- تایپی دارم که چندتا کلاس ازش استفاده می‌کنند و نمی‌خوام هی ساخته بشه و لازمه که instance یکسانی توسط این کلاس‌ها به اشتراک گذاشته بشه.(در این جا UserManager)

2- آبجکتی دارم مثل JSON Parser که ساختش هزینه زیادی داره و نمی‌خوام هربار که به عنوان وابستگی اعلان میشه، هی دوباره ساخته شه

این جور مواقع از مفهومی به نام scope استفاده می‌کنیم تا instance یکسانی از یک تایپ در یک کامپوننت داشته باشیم. به اینکار اسکوپ کردن یک تایپ به لایف سایکل کامپوننت هم گفته می‌شه. تا وقتی اون کامپوننت در حافظه هست، ما هم همین یک دونه instance از اون کلاس رو داریم و از بین نمی‌ره و دوباره هم ساخته نمی‌شه.

چطوری اسکوپ کنم؟ بیشتر توضیح بده اصلا نمی فهمم این اسکوپ چی هست!

با سینگلتون که آشنایی دارید؟ جواب شما : البته که داریم !!?

خب اینجا یک انوتیشن اسکوپ داریم به نام @Singleton. بالای سر اسم AppComponent و اون کلاسی که میخوایم یک بار ازش ساخته بشه در طول زندگی این کامپوننت (اینجا UserManager) یک انوتیشن سینگلتون می ذاریم. تمام!

سینگلتون که از قبل داشتیم ولی اگر لازم باشه خودمونم می تونیم انوتیشن اسکوپ بسازیم خیلی جالب و راحت که در ادامه یادتون می‌دم.

سینگلتون تنها انوتیشن اسکوپی هست که در پکیج javax.inject قرار داره.

پس چی شد؟

وقتی ما یک کامپوننت رو با Singleton انوتیت کنیم، همه کلاس‌هایی که با این انوتیشن مشخص بشن، به لایف سایکل اون کامپوننت وصل می‌شن یا اسکوپ می‌شن یا محدود می‌شن.

حالا AppComponent.ktرو باز کنید و با سینگلتون اون رو انوتیت کنید.

حالا هر کلاسی که با سینگلتون انوتیت بشه به AppComponent اسکوپ خواهد شد! پس بیایید اینکارو برای UserManager انجام بدیم:

در این مرحله دوباره پروژه رو اجرا کنید. مجددا ثبت نام انجام بدید و ببینید چی میشه؟

وقتی ثبت نام رو انجام می دید وارد جریان main می‌شید. مشکل حل شد!

راه حل پروژه که در تا اینجا بهش رسیدید در برنچ 1_registration_main کد گیتهاب وجود داره.

و باز بیایید ببینیم گراف برنامه تا اینجا چه شکلی شده؟

Current state of the graph with a unique instance of UserManager in AppComponent
Current state of the graph with a unique instance of UserManager in AppComponent


در بخش بعدی قراره با SubComponent ها آشنا بشیم.

بعدی

کُدلَب استفاده از دَگر در برنامه اندرویدی (6-SubComponent)

قبلی

کُدلَب استفاده از دَگر در برنامه اندرویدی (4-تزریق گراف به اکتیوتی)

کُدلَب استفاده از دَگِر در برنامه اندرویدی (3-انوتیشن‌ها)

کُدلَب استفاده از دَگِر در برنامه اندرویدی (2-شروع)

کُدلَب استفاده از دَگِر در برنامه اندرویدی(1-معرفی)

تزریق وابستگیکاتلیناندروید
برنامه نویس اندروید @NeshanMap
شاید از این پست‌ها خوشتان بیاید