TypeScript के लिए Dependency Injection कंटेनर क्या है?
Dependency Injection (DI) एक डिज़ाइन पैटर्न है जिसमें कोई ऑब्जेक्ट अपनी निर्भरताएँ बाहर से प्राप्त करता है, न कि उन्हें स्वयं बनाता है। DI-कंटेनर एक उपकरण है जो इन निर्भरताओं के निर्माण और इंजेक्शन को स्वचालित रूप से प्रबंधित करता है। TypeScript में, स्थैतिक टाइपिंग के कारण, DI-कंटेनर विशेष रूप से प्रभावी होते हैं: वे टाइप-सुरक्षा सुनिश्चित करते हैं और परीक्षण को सरल बनाते हैं।
कंटेनर का मुख्य कार्य इंटरफेस को उनके विशिष्ट कार्यान्वयन से जोड़ना और निर्भरता श्रृंखलाओं को हल करना है। यह ढीले-युग्मित, मॉड्यूलर कोड लिखने की अनुमति देता है जिसे बनाए रखना और विस्तारित करना आसान है।
TypeScript में DI-कंटेनर की आवश्यकता क्यों है?
- कोड युग्मन को कम करना — क्लास विशिष्ट कार्यान्वयन पर निर्भर नहीं होते, बल्कि केवल अमूर्तता (इंटरफेस) पर निर्भर होते हैं।
- परीक्षण को सरल बनाना — निर्भरताओं को आसानी से मॉक या स्टब से बदला जा सकता है।
- जीवनचक्र प्रबंधन — कंटेनर सिंगलटन, ट्रांज़िएंट ऑब्जेक्ट या निर्दिष्ट दायरे वाले ऑब्जेक्ट बना सकता है।
- स्वचालित निर्भरता समाधान — कंटेनर स्वयं निर्भरता ट्री बनाता है, डेवलपर को मैन्युअल ऑब्जेक्ट निर्माण से मुक्त करता है।
TypeScript के लिए लोकप्रिय DI-कंटेनर
दो सबसे सामान्य लाइब्रेरी देखें: InversifyJS और TSyringe। दोनों TypeScript का समर्थन करते हैं, लेकिन अलग-अलग दृष्टिकोण रखते हैं।
1. InversifyJS
InversifyJS डेकोरेटर के साथ एक शक्तिशाली IoC-कंटेनर है। इसे डेकोरेटर @injectable() और @inject() के माध्यम से निर्भरताओं के स्पष्ट निर्दिष्टीकरण की आवश्यकता होती है। यह स्पष्ट आर्किटेक्चर वाले बड़े प्रोजेक्ट्स के लिए उपयुक्त है।
स्थापना
npm install inversify reflect-metadata --savetsconfig.json फ़ाइल में निम्नलिखित शामिल करना सुनिश्चित करें:
{ "compilerOptions": { "experimentalDecorators": true, "emitDecoratorMetadata": true }}उपयोग का उदाहरण
import { Container, injectable, inject } from "inversify";import "reflect-metadata";
// बाइंडिंग के लिए इंटरफ़ेस और सिंबल परिभाषित करेंinterface ILogger { log(message: string): void;}const TYPES = { ILogger: Symbol.for("ILogger"), IUserService: Symbol.for("IUserService"),};
// लॉगर का कार्यान्वयन@injectable()class ConsoleLogger implements ILogger { log(message: string): void { console.log(`[LOG]: ${message}`); }}
// लॉगर पर निर्भर सेवा@injectable()class UserService { constructor(@inject(TYPES.ILogger) private logger: ILogger) {}
createUser(name: string): void { this.logger.log(`उपयोगकर्ता ${name} बनाया गया`); }}
// कंटेनर कॉन्फ़िगरेशनconst container = new Container();container.bind<ILogger>(TYPES.ILogger).to(ConsoleLogger).inSingletonScope();container.bind<UserService>(TYPES.IUserService).to(UserService);
// उपयोगconst userService = container.get<UserService>(TYPES.IUserService);userService.createUser("अलेक्से");2. TSyringe
TSyringe Microsoft का एक हल्का DI-कंटेनर है। यह डेकोरेटर और कंस्ट्रक्टर के माध्यम से स्वचालित समाधान का उपयोग करता है। यह मध्यम और छोटे प्रोजेक्ट्स के लिए आदर्श है।
स्थापना
npm install tsyringe reflect-metadata --savetsconfig.json कॉन्फ़िगरेशन InversifyJS के समान है।
उपयोग का उदाहरण
import { container, injectable, singleton } from "tsyringe";import "reflect-metadata";
// क्लास को सिंगलटन के रूप में रजिस्टर करें@singleton()class DatabaseConnection { connect(): void { console.log("डेटाबेस से कनेक्शन स्थापित हुआ"); }}
// स्वचालित निर्भरता इंजेक्शन वाला क्लास@injectable()class UserRepository { constructor(private db: DatabaseConnection) {}
save(user पुस्तकालय में भी
C++ में परीक्षण: फ्रेमवर्क और टूल्स का अवलोकन (Google Test, Catch2, doctest)
C# (.NET) में ZIP/आर्काइव के साथ काम करना: पूरी गाइड
KeychainAccess Swift: पूरी गाइड उदाहरणों के साथ