NestJSIntermediate
Providers এবং Dependency Injection
@Injectable, constructor injection, custom providers, scopes — NestJS DI বাংলায়।
12টি অংশবাংলা ভাষায়
Provider হলো যেকোনো class যা @Injectable() decorator ব্যবহার করে। Dependency Injection (DI) হলো এই providers-কে যেখানে দরকার সেখানে auto-প্রদান করা।
@Injectable ও Service
src/users/users.service.tstypescript
typescript
import { Injectable, NotFoundException } from "@nestjs/common";
export interface User {
id: number;
name: string;
email: string;
}
@Injectable()
export class UsersService {
private users: User[] = [
{ id: 1, name: "রহিম", email: "rahim@example.com" },
{ id: 2, name: "করিম", email: "karim@example.com" },
];
findAll(): User[] {
return this.users;
}
findOne(id: number): User {
const user = this.users.find((u) => u.id === id);
if (!user) throw new NotFoundException("User পাওয়া যায়নি");
return user;
}
create(data: Omit<User, "id">): User {
const user = { id: Date.now(), ...data };
this.users.push(user);
return user;
}
update(id: number, data: Partial<User>): User {
const user = this.findOne(id);
Object.assign(user, data);
return user;
}
remove(id: number): void {
this.findOne(id);
this.users = this.users.filter((u) => u.id !== id);
}
}Constructor DI — Service ব্যবহার
users.controller.tstypescript
typescript
import { Controller } from "@nestjs/common";
import { UsersService } from "./users.service";
@Controller("users")
export class UsersController {
// DI — constructor-এ inject
constructor(private readonly usersService: UsersService) {}
@Get()
findAll() {
return this.usersService.findAll();
}
}constructor(private readonly usersService: UsersService) — TypeScript এর shorthand। NestJS auto-detect করে UsersService created instance inject করে।
Provider Scopes
| Scope | Lifecycle | কখন |
|---|---|---|
| SINGLETON (default) | পুরো app-এ এক instance | সাধারণত এটাই দরকার |
| REQUEST | প্রতি request-এ নতুন instance | user-specific state দরকার হলে |
| TRANSIENT | প্রতি injection-এ নতুন instance | তারপরই সম্প্রতি দরকার হলে |
import { Injectable, Scope } from "@nestjs/common";
@Injectable({ scope: Scope.REQUEST })
export class RequestScopedService {
private requestId = Math.random();
getRequestId() { return this.requestId; }
}Custom Provider (Factory)
import { Module } from "@nestjs/common";
@Module({
providers: [
{
provide: "CONFIG",
useFactory: () => ({
port: process.env.PORT || 3000,
env: process.env.NODE_ENV,
}),
},
],
})
export class AppModule {}
// ব্যবহার
constructor(
@Inject("CONFIG") private config: { port: string; env: string },
) {}পরিবেশ type
Providers-এ business logic রাখুন, controller-এ শুধু request/response — এতে code testable ও maintainable হয়।
শেষ প্যারায় নিজে practice করুন — কোড কপি করে নিজের এডিটরে চালিয়ে দেখুন।