سرویس ها در انگولار یک قسمت حیاتی از این فریمورک هستند. آنها کلاسهای TypeScript هستند که منطق تجاری، دسترسی به دادهها یا منطق ارتباطی را برای اجزاء دیگر برنامه فراهم میکنند. سرویسها در انگولار طراحی شدهاند تا بتوانند در کامپوننتهای مختلف به اشتراک گذاشته و استفاده شوند و روشی برای مرکزیسازی عملکرد مشترک فراهم کنند.
ویژگیهای کلیدی سرویسهای انگولار عبارتاند از:
سینگلتون: به صورت پیشفرض، سرویسها در انگولار سینگلتون هستند، به این معنی که تنها یک نمونه از یک سرویس ایجاد میشود و در سراسر برنامه به اشتراک گذاشته میشود. این اطمینان میدهد که دادهها و وضعیت یکنواخت در کامپوننتهای مختلفی که از همان سرویس استفاده میکنند وجود دارد.
تزریق وابستگی: انگولار از تزریق وابستگی برای مدیریت ایجاد و به اشتراک گذاری نمونههای سرویسها استفاده میکند. به جای ایجاد دستی نمونههای سرویسها، سیستم تزریق وابستگی انگولار نمونه هایی از آنها را برای کامپوننتهایی که درخواست میکنند، فراهم میکند.
دکوراتور Injectable: برای ایجاد یک کلاس قابل تزریق به عنوان سرویس، باید آن را با دکوراتور @Injectable() دکوره کنید. این دکوراتور کلاس را به عنوان یک کاندید برای تزریق وابستگی مشخص میکند و به عنوان سرویس قابل ارائه میشود.
مرکزیسازی منطق تجاری: سرویسها راه بسیار خوبی برای مرکزیسازی منطق تجاری برنامه، تغییر دادن دادهها و ارتباط با رابطه عمومی ویژگیها هستند. این کار از جهت قابلیت تعمیر و خوانایی کد بهبود میبخشد.
به اشتراک گذاری داده: سرویسها برای به اشتراک گذاری داده بین کامپوننتهای مختلف به صورت منفصل استفاده میشوند. کامپوننتها میتوانند از همان سرویس برای دسترسی و تغییر دادههای به اشتراک گذاشته شده استفاده کنند.
قابل استفاده مجدد: سرویسها کد قابل استفاده مجدد را ترویج میکنند چرا که یکسانی بین چندین کامپوننت راهی را برای جلوگیری از تکرار کد فراهم میکنند و از یکپارچگی اطمینان حاصل میکنند.
سرویسها از جداسازی اهداف بین کامپوننتها و منطق تجاری بهره میبرند. کامپوننتها بر روی رندر کردن و تعامل کاربر تمرکز میکنند، در حالی که سرویسها عملکرد زیرین را انجام میدهند.
برای ایجاد یک سرویس میتوانید از دستور ng generate service service-name استفاده کنید. این دستور یک فایل سرویس جدید را در پوشه src/app ایجاد میکند و به طور خودکار آن را به آرایه providers در ماژول اصلی برنامه اضافه میکند که به صورت معمول در سراسر برنامه قابل دسترسی خواهد بود.
در انگولار تزریق وابستگی(Dependency Injection) به صورت خودکار فراهم میشود و به شما امکان میدهد نمونههای سرویسها را به کامپوننتها و دیگر اجزاء از طریقconstructor تزریق کنید. این روش بسیار موثر در جداسازی منطق کسبوکار از اجزاء فنی برنامه و بهبود قابلیت تستپذیری و قابلیت نگهداری کد است.
برای تزریق وابستگی در سرویسها، کافیست ابتدا یک سرویس را با دکوراتور ()Injectable@ معرفی کنید. این دکوراتور به انگولار اطلاع میدهد که کلاس قابل تزریق است و به عنوان یک کاندید برای تزریق وابستگی در نظر گرفته شود.
برای مثال، فرض کنید یک سرویس به نام MyService داریم:
سپس در کامپوننتها یا سایر سرویسها میتوانید از این سرویس با استفاده از تزریق وابستگی استفاده کنید. برای این منظور، نیاز است که نمونهی سرویس را به عنوان پارامتر بهconstructor کامپوننت یا سرویس دیگر تزریق کنید:
همچنین، توجه داشته باشید که اگرprovidedIn را برابر با 'root' تنظیم کنید، یک نمونه سینگلتون از سرویس در سراسر برنامه ایجاد میشود. یعنی این که همه کامپوننتها و سرویسها که از این سرویس استفاده میکنند، از همان نمونه استفاده میکنند. اگر از providedIn استفاده نکنید، شما باید این سرویس را به صورت دستی در آرایه providers در ماژول مورد نظر ثبت کنید.
تزریق وابستگی در انگولار از جمله اصول اساسی برای توسعه برنامههای قابل نگهداری و تستپذیر است، و به شما امکان میدهد کدهای خود را بهبود دهید و بهتر و قابلتر نگهدارید.
اگر از تزریق وابستگی(Dependency Injection) استفاده نمیکنید، میتوانید به دو روش زیر یک نمونه از سرویس را ایجاد کنید:
ایجاد دستی نمونه:
شما میتوانید به صورت دستی یک نمونه از سرویس را ایجاد کنید با استفاده از new کلمه کلیدی. این روش کاملاً معمولی است، اما به علت اینکه این نمونهها به صورت دستی ایجاد میشوند، معمولاً از آنها به عنوان سینگلتونها استفاده نمیشود.
به عنوان مثال:
استفاده از متد get در یک سرویس فراهمکننده:
شما میتوانید یک سرویس فراهمکننده (Provider) برای سرویسها ایجاد کنید که نمونههای سرویسها را ایجاد کند و فراهم کند. این روش به شما اجازه میدهد تا نمونههای سرویسها را با استفاده از متد get از سرویس فراهمکننده درخواست کنید.
به عنوان مثال:
سپس در کامپوننتهای خود میتوانید از این سرویس فراهمکننده استفاده کنید:
اگرچه این روشها نیاز به دستی ایجاد کردن نمونهها دارند و از لحاظ مدیریت وابستگیها و تستپذیری کد ممکن است کمی پیچیدهتر باشند، اما در موارد خاصی که نیاز به کنترل بیشتری بر روی سرویسها و نحوه ایجاد نمونهها دارید، ممکن است مفید باشند.