डिपेंडेंसी इंजेक्शन कंटेनर Swift: iOS/macOS के लिए Swinject

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

Swift (iOS/macOS) के लिए डिपेंडेंसी इंजेक्शन कंटेनर: Swinject

आधुनिक iOS और macOS डेवलपमेंट में Swift में, आर्किटेक्चरल पैटर्न रखरखाव योग्य और परीक्षण योग्य कोड बनाने में महत्वपूर्ण भूमिका निभाते हैं। डिपेंडेंसी इनवर्जन सिद्धांत (Dependency Inversion Principle) को लागू करने के लिए सबसे शक्तिशाली टूल में से एक Swinject है — एक हल्का लेकिन कार्यात्मक DI-कंटेनर, जो Swift में लिखा गया है। Swinject ऑब्जेक्ट्स के निर्माण और उनकी निर्भरताओं को केंद्रीय रूप से प्रबंधित करने की अनुमति देता है, जिससे डेवलपर को ऑब्जेक्ट ग्राफ के मैन्युअल निर्माण से मुक्ति मिलती है।



डिपेंडेंसी इंजेक्शन क्या है और कंटेनर की आवश्यकता क्यों है?

डिपेंडेंसी इंजेक्शन (DI) एक तकनीक है जिसमें एक ऑब्जेक्ट अपनी निर्भरताएँ बाहर से प्राप्त करता है, न कि उन्हें स्वयं बनाता है। यह कोड के युग्मन को कम करता है और मॉड्यूलर परीक्षण को सरल बनाता है। हालांकि, बड़े प्रोजेक्ट्स में, मैन्युअल डिपेंडेंसी इंजेक्शन से कोड भारी हो जाता है। यहाँ DI-कंटेनर मदद करता है, जो:

  • ऑब्जेक्ट्स के निर्माण और जुड़ाव को स्वचालित करता है
  • ऑब्जेक्ट्स के जीवनकाल का प्रबंधन करता है (सिंगलटन, नए इंस्टेंस)
  • कार्यान्वयन के प्रतिस्थापन को सरल बनाता है (उदाहरण के लिए, परीक्षण के लिए)
  • कोड की पठनीयता और रखरखाव क्षमता बढ़ाता है


Swinject की स्थापना

Swinject को Swift Package Manager, CocoaPods या Carthage के माध्यम से स्थापित किया जा सकता है। SPM के लिए, Package.swift में जोड़ें:

dependencies: [    .package(url: "https://github.com/Swinject/Swinject.git", from: "2.8.0")]

या CocoaPods के माध्यम से:

pod 'Swinject', '~> 2.8'


Swinject की मुख्य अवधारणाएँ

लाइब्रेरी कई प्रमुख घटकों पर आधारित है:

  • Container — मुख्य रजिस्ट्रार और निर्भरताओं का समाधानकर्ता
  • Service — वह प्रकार जो पंजीकृत किया जाता है (आमतौर पर प्रोटोकॉल या क्लास)
  • Component — सेवा का विशिष्ट कार्यान्वयन
  • Scope — ऑब्जेक्ट के जीवनकाल को परिभाषित करता है (transient, graph, container, weak)


व्यावहारिक उदाहरण: निर्भरताओं का पंजीकरण और समाधान

एक सामान्य परिदृश्य पर विचार करें — एक प्रमाणीकरण सेवा वाला एप्लिकेशन और एक कंट्रोलर जो इसका उपयोग करता है।

// सेवा प्रोटोकॉलprotocol AuthServiceProtocol {    func login(username: String, password: String) -> Bool}

// कार्यान्वयनclass AuthService: AuthServiceProtocol { func login(username: String, password: String) -> Bool { // प्रमाणीकरण तर्क return username == "admin" && password == "1234" }}

// कंट्रोलर, AuthServiceProtocol पर निर्भरclass LoginViewController { private let authService: AuthServiceProtocol // इनिशियलाइज़र के माध्यम से इंजेक्शन init(authService: AuthServiceProtocol) { self.authService = authService } func authenticate(user: String, pass: String) { if authService.login(username: user, password: pass) { print("सफल लॉगिन") } else { print("गलत डेटा") } }}

// कंटेनर सेटअपlet container = Container()container.register(AuthServiceProtocol.self) { _ in AuthService() }container.register(LoginViewController.self) { r in LoginViewController(authService: r.resolve(AuthServiceProtocol.self)!)}

// उपयोगlet controller = container.resolve(LoginViewController.self)!controller.authenticate(user: "admin", pass: "1234") // सफल लॉगिन


जीवनकाल प्रबंधन (Scopes)

Swinject चार अंतर्निहित scope का समर्थन करता है:

  • .transient — हर बार एक नया इंस्टेंस बनाया जाता है (डिफ़ॉल्ट)
  • .graph — प्रति समाधान ग्राफ एक इंस्टेंस (अधिकांश मामलों के लिए डिफ़ॉल्ट रूप से उपयोग किया जाता है)
  • .container — कंटेनर के दायरे में सिंगलटन
  • .weak — कमजोर संदर्भ, ऑब्जेक्ट

अनुशंसाएँ