Angular-এ সার্ভিস এবং ডিপেন্ডেন্সি ইনজেকশন (DI) অত্যন্ত গুরুত্বপূর্ণ ধারণা, যা অ্যাপ্লিকেশনটির কাঠামো এবং কন্ট্রোলের জন্য অপরিহার্য। এটি অ্যাপ্লিকেশনগুলিকে আরও মডুলার, স্কেলেবল, এবং টেস্টেবল করে তোলে।
সার্ভিস হল একটি ক্লাস যা সাধারণত অ্যাপ্লিকেশনের ব্যবসায়িক লজিক বা ডেটা ম্যানিপুলেশন সম্পাদন করে। Angular-এ সার্ভিস ব্যবহার করা হয় যাতে কম্পোনেন্টগুলো থেকে অপ্রয়োজনীয় লজিক এবং ডেটা ম্যানেজমেন্ট আলাদা করা যায়। এতে কোড পুনরায় ব্যবহৃত হতে পারে এবং অ্যাপ্লিকেশনের ভেতরে ডেটা শেয়ার করা সহজ হয়। Angular সার্ভিসগুলো Singleton (একক ইন্সট্যান্স) হিসেবে কাজ করে, অর্থাৎ সার্ভিসের একটিমাত্র ইন্সট্যান্স তৈরি হয় এবং তা অ্যাপ্লিকেশনের বিভিন্ন অংশে শেয়ার করা হয়।
একটি সাধারণ সার্ভিস তৈরি করতে Angular CLI ব্যবহার করা যেতে পারে:
ng generate service user
এটি user.service.ts
নামের একটি সার্ভিস ফাইল তৈরি করবে।
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root', // সার্ভিসটি অ্যাপ্লিকেশন জুড়ে একক ইন্সট্যান্স হিসেবে ব্যবহার হবে
})
export class UserService {
constructor() { }
getUser() {
return { name: 'John Doe', age: 30 };
}
}
এখানে, @Injectable
ডেকোরেটরটি Angular-কে জানিয়ে দেয় যে এই ক্লাসটি একটি সার্ভিস এবং এটি Dependency Injection এর মাধ্যমে ইনজেক্ট করা যেতে পারে। providedIn: 'root'
নির্দেশ করে যে সার্ভিসটি অ্যাপ্লিকেশন জুড়ে একক ইন্সট্যান্স হিসেবে ব্যবহৃত হবে।
ডিপেন্ডেন্সি ইনজেকশন (DI) হল একটি ডিজাইন প্যাটার্ন, যার মাধ্যমে Angular অ্যাপ্লিকেশন অবজেক্টগুলির ডিপেন্ডেন্সি সরবরাহ করে। Angular DI কন্টেইনারের মাধ্যমে সার্ভিসগুলো ইনজেক্ট করে, যার ফলে কোড আরো মডুলার এবং টেস্টযোগ্য হয়। এর ফলে, কম্পোনেন্টগুলিকে ডিপেন্ডেন্সি বা সার্ভিস তাদের কনস্ট্রাক্টরে ইনজেক্ট করা যায়।
@Injectable
ডেকোরেটর দেওয়া থাকে। এই ডেকোরেটরের মাধ্যমে Angular সার্ভিসটির ইন্সট্যান্স তৈরি করে এবং তা ব্যবহারকারী কম্পোনেন্ট বা সার্ভিসে ইনজেক্ট করে।ধরা যাক, UserService
সার্ভিসকে AppComponent
-এ ইনজেক্ট করতে চান।
কম্পোনেন্ট (TypeScript):
import { Component } from '@angular/core';
import { UserService } from './user.service'; // সার্ভিস ইমপোর্ট করা
@Component({
selector: 'app-root',
template: `<h1>{{ user.name }}</h1>`
})
export class AppComponent {
user: any;
constructor(private userService: UserService) { // সার্ভিস ইনজেক্ট করা
this.user = this.userService.getUser(); // সার্ভিসের মেথড কল করা
}
}
এখানে, UserService
সার্ভিসটি AppComponent
-এ ইনজেক্ট করা হয়েছে constructor
-এর মাধ্যমে। Angular DI কন্টেইনার স্বয়ংক্রিয়ভাবে UserService
ইন্সট্যান্স তৈরি করে এবং এটি কম্পোনেন্টে সরবরাহ করে।
providedIn: 'root'
এর মাধ্যমে কনফিগার করা হয়।providers
অ্যারে ব্যবহার করে সার্ভিস প্রদান করতে পারেন।@NgModule({
declarations: [...],
imports: [...],
providers: [UserService], // সার্ভিস শুধুমাত্র এই মডিউলে ব্যবহার হবে
bootstrap: [AppComponent]
})
export class FeatureModule { }
এখানে UserService
শুধুমাত্র FeatureModule মডিউলে ইনজেক্ট করা যাবে।
একটি সার্ভিসে সাধারণত বিজনেস লজিক এবং ডেটা ম্যানিপুলেশন কোড রাখা হয়, যা একাধিক কম্পোনেন্ট বা অন্যান্য সার্ভিসে পুনঃব্যবহার করা যায়।
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class ApiService {
constructor(private http: HttpClient) { }
getData(): Observable<any> {
return this.http.get('https://api.example.com/data');
}
}
import { Component, OnInit } from '@angular/core';
import { ApiService } from './api.service';
@Component({
selector: 'app-data',
template: `<div>{{ data | json }}</div>`
})
export class DataComponent implements OnInit {
data: any;
constructor(private apiService: ApiService) {}
ngOnInit() {
this.apiService.getData().subscribe(data => {
this.data = data;
});
}
}
এখানে ApiService
ব্যবহার করে অ্যাসিঙ্ক্রোনাসভাবে ডেটা ফেচ করা হচ্ছে এবং Angular DI ব্যবস্থার মাধ্যমে সার্ভিসটি ইনজেক্ট করা হয়েছে।
Angular-এ সার্ভিসের স্কোপ এবং লিফটাইফ সম্পর্কে ধারণা রাখা খুবই গুরুত্বপূর্ণ। স্কোপ অনুযায়ী সার্ভিসটি অ্যাপ্লিকেশন জুড়ে একক ইন্সট্যান্স হবে বা নির্দিষ্ট মডিউলের মধ্যে থাকবে। এটি অ্যাপ্লিকেশনের স্থিতি এবং কর্মক্ষমতা উন্নত করতে সাহায্য করে।
Angular-এ সার্ভিস হল এমন একটি ক্লাস যা কম্পোনেন্ট, ডিরেক্টিভ, বা অন্যান্য সার্ভিসের মধ্যে পুনঃব্যবহারযোগ্য লজিক এবং ডেটা সরবরাহ করে। সার্ভিস সাধারণত অ্যাপ্লিকেশন লেভেলের ডেটা ম্যানেজমেন্ট, HTTP কল, ফর্ম ভ্যালিডেশন বা অন্যান্য কাজে ব্যবহৃত হয়। Angular সার্ভিসের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য হল ডিপেন্ডেন্সি ইনজেকশন (Dependency Injection, DI), যার মাধ্যমে সার্ভিসগুলিকে কম্পোনেন্ট বা অন্যান্য সার্ভিসে ইনজেক্ট করা হয়।
Angular-এ সার্ভিস তৈরি করার জন্য, আমরা সাধারণত CLI ব্যবহার করি, যেটি কোড জেনারেট করতে দ্রুত এবং সহজ উপায় প্রদান করে।
ng generate service user
এটি user.service.ts
নামের একটি সার্ভিস ফাইল তৈরি করবে, যেখানে আমরা আমাদের সার্ভিসের লজিক লিখতে পারব।
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root' // সার্ভিসটি রুট লেভেলে ইনজেক্ট হবে
})
export class UserService {
constructor() { }
getUserData() {
return { name: 'John Doe', age: 30 };
}
saveUserData(user: any) {
console.log('User data saved:', user);
}
}
এখানে:
@Injectable
ডেকোরেটরটি Angular-কে জানিয়ে দেয় যে এই ক্লাসটি একটি সার্ভিস এবং এটি ইনজেকশনের জন্য প্রস্তুত।providedIn: 'root'
নির্দেশ করে যে সার্ভিসটি অ্যাপ্লিকেশন জুড়ে একটি একক ইন্সট্যান্স (singleton) হিসেবে ব্যবহৃত হবে।একবার সার্ভিস তৈরি হলে, আপনি এটি Angular কম্পোনেন্ট, ডিরেক্টিভ, অথবা অন্য সার্ভিসে ব্যবহার করতে পারেন। সার্ভিসে getUserData()
এবং saveUserData()
ফাংশন রয়েছে, এখন এই সার্ভিসকে একটি কম্পোনেন্টে ইনজেক্ট করা যাক।
প্রথমে, কম্পোনেন্টে সার্ভিসটি ইনজেক্ট করতে হবে:
import { Component } from '@angular/core';
import { UserService } from './user.service'; // সার্ভিস ইমপোর্ট
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
})
export class AppComponent {
user: any;
constructor(private userService: UserService) { }
ngOnInit() {
this.user = this.userService.getUserData();
}
saveData() {
this.userService.saveUserData(this.user);
}
}
এখানে:
UserService
ইনজেক্ট করা হয়েছে কম্পোনেন্টের কনস্ট্রাক্টরের মাধ্যমে।getUserData()
ফাংশনটি সার্ভিস থেকে ইউজারের ডেটা নিয়ে এসেছে এবং কম্পোনেন্টে প্রদর্শন করা হয়েছে।saveData()
ফাংশনটি সার্ভিসের saveUserData()
ফাংশনকে কল করছে, যা ইউজারের ডেটা কনসোলে লগ করে।<h1>User Data</h1>
<p>Name: {{ user.name }}</p>
<p>Age: {{ user.age }}</p>
<button (click)="saveData()">Save User Data</button>
এখানে, ইউজারের নাম এবং বয়স প্রদর্শিত হচ্ছে এবং একটি বাটনে ক্লিক করলে saveData()
ফাংশনটি কল হয়ে সার্ভিসের মাধ্যমে ডেটা সেভ হবে।
Angular-এ ডিপেন্ডেন্সি ইনজেকশন (DI) ব্যবহারের মাধ্যমে সার্ভিসগুলিকে কম্পোনেন্টে ইনজেক্ট করা হয়। DI নিশ্চিত করে যে প্রতিটি কম্পোনেন্ট বা সার্ভিস তাদের প্রয়োজনীয় সার্ভিস বা ডিপেন্ডেন্সি অ্যাঙ্গুলার রাউটার বা অন্যান্য অংশ থেকে সহজে পেয়ে যাবে।
যদি আপনি দুটি সার্ভিসকে ইনজেক্ট করতে চান, তাহলে কনস্ট্রাক্টরের মাধ্যমে তা করা হয়:
import { Component } from '@angular/core';
import { UserService } from './user.service';
import { ProductService } from './product.service';
@Component({
selector: 'app-root',
templateUrl: './app.component.html'
})
export class AppComponent {
constructor(private userService: UserService, private productService: ProductService) { }
ngOnInit() {
console.log(this.userService.getUserData());
console.log(this.productService.getProductList());
}
}
এখানে, UserService এবং ProductService দুটো সার্ভিসকে একসাথে ইনজেক্ট করা হয়েছে।
এছাড়া, সার্ভিসে HTTP কল করার জন্য HttpClient ব্যবহার করা যায়। HTTP কলের মাধ্যমে সার্ভিসটি অ্যাপ্লিকেশন থেকে সার্ভারের সঙ্গে ডেটা আদান-প্রদান করতে পারে। HttpClientModule
ইনপোর্ট করে HTTP সার্ভিস ব্যবহার করা যায়।
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Injectable({
providedIn: 'root'
})
export class ApiService {
constructor(private http: HttpClient) { }
getData() {
return this.http.get('https://api.example.com/data');
}
}
এখানে, getData()
ফাংশনটি HTTP GET রিকোয়েস্ট চালাচ্ছে এবং সার্ভার থেকে ডেটা নিয়ে আসছে।
Angular-এ @Injectable
ডেকোরেটর একটি ক্লাসকে ইনজেকশনের জন্য প্রস্তুত করে। এটি মূলত Angular এর ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের অংশ। যখন কোনো ক্লাসে @Injectable
ডেকোরেটর ব্যবহার করা হয়, তখন Angular জানে যে এই ক্লাসটিকে এক বা একাধিক কম্পোনেন্ট, সার্ভিস, বা ডিরেক্টিভে ইনজেক্ট করা যেতে পারে এবং Angular নিজে তার ইনস্ট্যান্স তৈরি করে সেগুলিতে সরবরাহ করবে।
@Injectable
ডেকোরেটরের ব্যবহার@Injectable
ডেকোরেটর ব্যবহার করা হয় যখন আপনি Angular এর DI সিস্টেমের মাধ্যমে সার্ভিস বা ক্লাস ইনজেক্ট করতে চান। এটি একটি ক্লাসের জন্য নির্ধারণ করে যে সেই ক্লাসটি Angular এর DI কন্টেইনারে নিবন্ধিত হবে এবং সেই ক্লাসের ইন্সট্যান্স অটোমেটিকভাবে কম্পোনেন্ট বা সার্ভিসে ইনজেক্ট হবে।
@Injectable
ডেকোরেটর ব্যবহার করা@Injectable
ডেকোরেটর সাধারণত সার্ভিস ক্লাসে ব্যবহৃত হয়, তবে এটি অন্য যেকোনো ক্লাসে ব্যবহার করা যেতে পারে যেটি DI মাধ্যমে সরবরাহ করতে চান।
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root' // 'root' নির্দেশ করে সার্ভিসটি পুরো অ্যাপ্লিকেশন জুড়ে একটি একক ইনস্ট্যান্স হিসেবে থাকবে
})
export class MyService {
constructor() { }
getGreeting(): string {
return "Hello from MyService!";
}
}
এখানে:
@Injectable()
ডেকোরেটরটি Angular কে জানিয়ে দেয় যে এই ক্লাসটি সার্ভিস হিসেবে ইনজেকশনযোগ্য।providedIn: 'root'
নির্দেশ করে যে সার্ভিসটি অ্যাপ্লিকেশনের একক (singleton) ইন্সট্যান্স হিসেবে ব্যবহৃত হবে এবং এটি অ্যাপ্লিকেশনের পুরো লাইফটাইম জুড়ে অ্যাক্সেসযোগ্য থাকবে।@Injectable
ডেকোরেটরের কনফিগারেশন@Injectable
ডেকোরেটরের মধ্যে providedIn
একটি অত্যন্ত গুরুত্বপূর্ণ কনফিগারেশন। এটি নির্ধারণ করে সার্ভিসটি কোথায় ব্যবহারযোগ্য হবে। এর বিভিন্ন মান হতে পারে:
providedIn: 'root'
: সার্ভিসটি অ্যাপ্লিকেশনের সমস্ত অংশে শেয়ার করা যাবে এবং এটি একক (singleton) হিসেবে ব্যবহৃত হবে।providedIn: 'any'
: সার্ভিসটি lazy-loaded মডিউলগুলির জন্য আলাদাভাবে তৈরি হবে। এটি তখন কেবলমাত্র সেই মডিউলে ব্যবহারযোগ্য হবে যেটি লোড হয়েছে।providedIn: 'platform'
: সার্ভিসটি অ্যাপ্লিকেশনের সার্বিক লাইফটাইমে একাধিক ইন্সট্যান্সে প্রদত্ত হবে, এটি সাধারণত অ্যাঙ্গুলারের গভীর সার্ভিসগুলোতে ব্যবহৃত হয়।providedIn: 'module'
: সার্ভিসটি শুধুমাত্র নির্দিষ্ট মডিউলে ইনজেক্ট করা হবে।@Injectable
ডেকোরেটরের কার্যকারিতা@Injectable
ডেকোরেটর মূলত Angular-কে জানিয়ে দেয় যে ওই ক্লাসটির জন্য ডিপেন্ডেন্সি ইনজেকশন ব্যবহার করা যাবে। যেহেতু সার্ভিস ক্লাস সাধারণত ডিপেন্ডেন্সি হিসেবে কাজ করে, Angular এই সার্ভিস ক্লাসের একটি ইন্সট্যান্স তৈরি করে এবং যখনই ওই সার্ভিসটি প্রয়োজন হয়, এটি কম্পোনেন্টে ইনজেক্ট করে দেয়।
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class UserService {
private users = ['John', 'Jane', 'Doe'];
getUsers() {
return this.users;
}
}
এখানে UserService
একটি সার্ভিস যা ব্যবহারকারীদের তালিকা সরবরাহ করে। এই সার্ভিসটি @Injectable
ডেকোরেটর দ্বারা ইনজেকশনযোগ্য করে তোলা হয়েছে এবং এটি root
এ providedIn
মান সহ মডিউলের মধ্যে উপলব্ধ।
কম্পোনেন্টে এই সার্ভিস ইনজেক্ট করতে:
import { Component } from '@angular/core';
import { UserService } from './user.service';
@Component({
selector: 'app-root',
template: `<h1>{{ users }}</h1>`
})
export class AppComponent {
users: string[];
constructor(private userService: UserService) {
this.users = this.userService.getUsers();
}
}
এখানে:
UserService
কে AppComponent
-এ ইনজেক্ট করা হয়েছে constructor
এর মাধ্যমে।UserService
এর ইন্সট্যান্স তৈরি করেছে এবং এটি AppComponent
-এ ইনজেক্ট করেছে।@Injectable
ডেকোরেটরটি একটি ক্লাসকে ইনজেকশনযোগ্য করে তোলে।providedIn
কনফিগারেশন ব্যবহার করে নির্ধারণ করা হয় সার্ভিসটি অ্যাপ্লিকেশনের কোথায় ইনজেক্ট হবে।Angular এর হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশন (HDI) একটি শক্তিশালী ডিজাইন প্যাটার্ন যা সার্ভিস ইনজেকশন ব্যবস্থাকে অনেক স্তরে (hierarchical levels) সম্প্রসারণ করে। এটি Angular এর ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা অ্যাপ্লিকেশনের বিভিন্ন স্তরে (modules, components, services) ডিপেন্ডেন্সি ইনজেকশন নিয়ন্ত্রণ করতে সাহায্য করে। এর মাধ্যমে আপনি স্পেসিফিক স্তরে নির্দিষ্ট সার্ভিসের একটি নতুন ইন্সট্যান্স তৈরি করতে পারেন।
Angular-এর ডিপেন্ডেন্সি ইনজেকশন সিস্টেম একটি হায়ারার্কিক্যাল কাঠামোতে কাজ করে। এর মানে হলো, সার্ভিস ইনজেকশনের জন্য একটি হায়ারার্কি বা স্তর ভিত্তিক (level-based) মডেল রয়েছে যেখানে:
এই স্তরগুলির মধ্যে, কম্পোনেন্ট বা মডিউলে যেকোনো সার্ভিস ইনজেক্ট করা হলে, যদি সার্ভিসটি উচ্চতর স্তরে (অথবা রুট মডিউলে) ইনজেক্ট করা না থাকে, তবে এটি কম্পোনেন্ট বা মডিউলের নির্দিষ্ট স্তরে তার নিজস্ব ইন্সট্যান্স তৈরি করবে।
Angular একটি root injector এবং child injectors ব্যবহার করে:
এটি একটি ইনজেকশন হায়ারার্কি তৈরি করে, যেখানে সার্ভিসের ভিন্ন ভিন্ন স্তরের ইন্সট্যান্স তৈরি হয়, এবং এগুলি নির্দিষ্ট স্তরে লুকানো বা প্রদর্শিত হতে পারে।
ধরা যাক, আপনার একটি LoggerService
নামক সার্ভিস রয়েছে, যেটি অ্যাপের বিভিন্ন অংশে ব্যবহৃত হবে, এবং আপনি চাইছেন যে এই সার্ভিসের ইনস্ট্যান্সকে রুট, মডিউল, এবং কম্পোনেন্ট স্তরে কিভাবে কন্ট্রোল করবেন।
আপনি যদি সার্ভিসটিকে রুট স্তরে ইনজেক্ট করেন, তাহলে এটি অ্যাপ্লিকেশনের সব অংশে একক ইন্সট্যান্স হিসেবে ব্যবহৃত হবে।
@Injectable({
providedIn: 'root' // রুট স্তরে ইনজেক্ট করা হচ্ছে
})
export class LoggerService {
log(message: string) {
console.log(message);
}
}
যদি আপনি সার্ভিসটি একটি নির্দিষ্ট মডিউলে ইনজেক্ট করেন, তবে এটি শুধুমাত্র সেই মডিউলের কম্পোনেন্টগুলির জন্য ইনজেক্ট হবে।
@NgModule({
providers: [LoggerService] // মডিউল স্তরে সার্ভিস ইনজেক্ট করা
})
export class AppModule { }
কম্পোনেন্ট স্তরে সার্ভিস ইনজেক্ট করলে, সার্ভিসটি শুধুমাত্র ঐ কম্পোনেন্টের জন্য পৃথক ইন্সট্যান্স তৈরি করবে।
@Component({
selector: 'app-home',
providers: [LoggerService] // কম্পোনেন্ট স্তরে সার্ভিস ইনজেক্ট করা
})
export class HomeComponent {
constructor(private logger: LoggerService) {}
}
এখানে, LoggerService
কেবলমাত্র HomeComponent
এর মধ্যে ইনজেক্ট হবে এবং এটি অন্য কম্পোনেন্টে আলাদা ইন্সট্যান্স হবে।
Angular এর হায়ারার্কিক্যাল ডিপেন্ডেন্সি ইনজেকশন আপনাকে সার্ভিসের ইন্সট্যান্সের জীবনচক্র এবং স্কোপ কন্ট্রোল করতে দেয়, যা কোডের রক্ষণাবেক্ষণ এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে। এটি রুট, মডিউল এবং কম্পোনেন্ট স্তরে ইনজেকশন নিয়ন্ত্রণ করতে সহায়ক, এবং প্রয়োজনে একই সার্ভিসের ভিন্ন ভিন্ন ইন্সট্যান্স তৈরি করার সুবিধা দেয়।
Angular-এ সিঙ্গেলটন সার্ভিস হল এমন একটি সার্ভিস, যা একটি অ্যাপ্লিকেশনের জীবনকাল (lifetime) জুড়ে শুধুমাত্র একটি একক ইনস্ট্যান্স তৈরি করে এবং তা একাধিক কম্পোনেন্ট বা সার্ভিসের মধ্যে শেয়ার করা হয়। এই সার্ভিসটি সাধারণত অ্যাপ্লিকেশনের গ্লোবাল স্টেট বা গ্লোবাল ফাংশনালিটি প্রদান করে, যেমন ডেটা শেয়ারিং, লগিং, API কল, ইত্যাদি।
Angular ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের মাধ্যমে সিঙ্গেলটন সার্ভিসগুলি কার্যকরী হয়। @Injectable() ডেকোরেটর এবং providedIn অপশন ব্যবহার করে সিঙ্গেলটন সার্ভিস তৈরি করা হয়।
Angular ডিপেন্ডেন্সি ইনজেকশন (DI) সিস্টেমের মাধ্যমে, সার্ভিসগুলো বিভিন্ন কম্পোনেন্ট বা ডিপেন্ডেন্ট ক্লাসে ইনজেক্ট করা হয়। সিঙ্গেলটন সার্ভিসের ক্ষেত্রে, DI সিস্টেম এটি নিশ্চিত করে যে, সার্ভিসটির একটিমাত্র ইনস্ট্যান্স পুরো অ্যাপ্লিকেশন জুড়ে ব্যবহৃত হবে।
@Injectable() ডেকোরেটর দিয়ে সার্ভিসটি Angular এর DI সিস্টেমে নিবন্ধিত হয়। সিঙ্গেলটন সার্ভিস তৈরি করতে providedIn অপশন ব্যবহার করা হয়, যা সার্ভিসটির স্কোপ নির্ধারণ করে।
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root' // এটি সার্ভিসটি অ্যাপ্লিকেশনটির রুট স্কোপে ইনজেক্ট করবে, যা সিঙ্গেলটন সার্ভিস তৈরি করে
})
export class LoggingService {
log(message: string) {
console.log(message);
}
}
এখানে, providedIn: 'root' মানে হচ্ছে সার্ভিসটি পুরো অ্যাপ্লিকেশন জুড়ে একমাত্র ইনস্ট্যান্সে উপলব্ধ হবে। root স্কোপে এই সার্ভিসটিকে নিবন্ধিত করা হয়, যার ফলে এটি অ্যাপ্লিকেশনের যে কোন কম্পোনেন্টে ব্যবহৃত হতে পারে।
এখন এই সিঙ্গেলটন সার্ভিসটি যে কোন কম্পোনেন্টে ইনজেক্ট করা যেতে পারে এবং শুধুমাত্র একটি ইনস্ট্যান্স ব্যবহার করা হবে।
import { Component } from '@angular/core';
import { LoggingService } from './logging.service';
@Component({
selector: 'app-home',
templateUrl: './home.component.html'
})
export class HomeComponent {
constructor(private loggingService: LoggingService) {
this.loggingService.log('Home component loaded');
}
}
এখানে LoggingService সিঙ্গেলটন সার্ভিসটি HomeComponent-এ ইনজেক্ট করা হয়েছে। এই সার্ভিসটি ব্যবহার করে আমরা কোনো লগ মেসেজ কনসোলে প্রিন্ট করতে পারি।
import { Component } from '@angular/core';
import { LoggingService } from './logging.service';
@Component({
selector: 'app-about',
templateUrl: './about.component.html'
})
export class AboutComponent {
constructor(private loggingService: LoggingService) {
this.loggingService.log('About component loaded');
}
}
এখানে, AboutComponent-এও LoggingService ইনজেক্ট করা হয়েছে। কিন্তু, যেহেতু এটি একটি সিঙ্গেলটন সার্ভিস, তাই এটি শুধুমাত্র একটি ইনস্ট্যান্স থাকবে এবং HomeComponent এবং AboutComponent উভয়ই সেই একই ইনস্ট্যান্স শেয়ার করবে।
Angular-এ সিঙ্গেলটন সার্ভিস ব্যবহারের জন্য providedIn অপশনটি ব্যবহার করা হয়। এছাড়া, যদি আপনি সার্ভিসটিকে নির্দিষ্ট মডিউলের মধ্যে সীমাবদ্ধ করতে চান, তবে এটি শুধুমাত্র ওই মডিউলের স্কোপে প্রদান করা হবে। উদাহরণস্বরূপ, যদি আপনি সার্ভিসটি কেবলমাত্র FeatureModule এ ব্যবহার করতে চান:
@Injectable({
providedIn: FeatureModule
})
export class FeatureService {
// সার্ভিসের কোড
}
এভাবে, এই সার্ভিসটি শুধুমাত্র FeatureModule এর মধ্যে ইনজেক্ট হবে এবং অ্যাপ্লিকেশনের অন্য কোথাও উপলব্ধ হবে না।
Angular-এ সিঙ্গেলটন সার্ভিস একটি গুরুত্বপূর্ণ কনসেপ্ট যা ডিপেন্ডেন্সি ইনজেকশন ব্যবস্থাপনা ও অ্যাপ্লিকেশনের গ্লোবাল স্টেট শেয়ার করতে সাহায্য করে। এটি একাধিক কম্পোনেন্টে ব্যবহৃত হলেও, সার্ভিসটির শুধুমাত্র একটি ইনস্ট্যান্স তৈরি হয় এবং অ্যাপ্লিকেশনের পুরো জীবনকাল জুড়ে এটি ব্যবহৃত হয়।
Read more