Swinject Swift के लिए एक DI कंटेनर है जो iOS एप्लिकेशन में Dependency Injection पैटर्न लागू करता है। फ्रेमवर्क निर्भरताओं के निर्माण और इंजेक्शन को स्वचालित करता है, मैन्युअल ऑब्जेक्ट और फैक्ट्री प्रबंधन को समाप्त करता है। GitHub पर Swinject के अनुसार, लाइब्रेरी Constructor Injection, Property Injection और Method Injection को लचीली scopes प्रणाली के साथ जीवनकाल प्रबंधन के लिए समर्थन करती है।
मुख्य बिंदु
Swinject Swift भाषा के लिए एक ओपन-सोर्स DI कंटेनर है, जो iOS, macOS और watchOS के लिए एप्लिकेशन में निर्भरता इंजेक्शन को सरल बनाने के लिए डिज़ाइन किया गया है। फ्रेमवर्क Service Locator दृष्टिकोण का उपयोग करता है: सेवाएँ एक केंद्रीय कंटेनर में पंजीकृत की जाती हैं, और कंटेनर इंस्टेंस का अनुरोध करने पर स्वचालित रूप से निर्भरता ग्राफ को हल करता है।
Dependency Injection (DI) एक डिज़ाइन पैटर्न है जहाँ एक ऑब्जेक्ट अपनी निर्भरताएँ बाहर से प्राप्त करता है न कि उन्हें आंतरिक रूप से बनाता है। यह घटकों के बीच युग्मन को कम करता है, यूनिट परीक्षण को सरल बनाता है और उपभोक्ता कोड को संशोधित किए बिना कार्यान्वयन को बदलने की अनुमति देता है।
Martin Fowler (2004) के अनुसार, DI, Inversion of Control का एक विशिष्ट मामला है और कंस्ट्रक्टर, प्रॉपर्टी या मेथड इंजेक्शन के माध्यम से कार्यान्वित किया जाता है। Swinject इस प्रक्रिया को स्वचालित करता है, मैन्युअल रूप से फैक्ट्री और सर्विस लोकेटर लिखने की आवश्यकता को समाप्त करता है।
Swinject का उपयोग तीन या अधिक सेवाओं वाले प्रोजेक्ट्स में करें जिनमें क्रॉस-निर्भरताएँ हों, जहाँ मैन्युअल ऑब्जेक्ट निर्माण इनिशियलाइज़ेशन कोड को बढ़ाता है और परीक्षण क्षमता को कम करता है।
Swinject Apple इकोसिस्टम के साथ गहराई से एकीकृत होता है और Swift 3.0 से शुरू सभी Swift संस्करणों का समर्थन करता है। फ्रेमवर्क ब्रिज के माध्यम से Objective-C के साथ संगत है, जिससे इसे पूर्ण कोड माइग्रेशन के बिना मौजूदा मिश्रित-भाषा प्रोजेक्ट्स में पेश किया जा सकता है। यह विशेष रूप से पाँच वर्षों से अधिक के विकास इतिहास वाले बड़े एप्लिकेशन के लिए प्रासंगिक है।
Swinject कंटेनर Container वर्ग द्वारा कार्यान्वित किया जाता है, जो पंजीकृत सेवाओं का रजिस्ट्री संग्रहीत करता है। जब resolve विधि कॉल की जाती है, तो कंटेनर एक ऑब्जेक्ट बनाता है, पंजीकरण ग्राफ के माध्यम से अपनी सभी निर्भरताओं को पुनरावर्ती रूप से हल करता है।
Container केंद्रीय ऑब्जेक्ट है जहाँ अमूर्तताओं और उनके कार्यान्वयन के बीच मैपिंग पंजीकृत की जाती है। Service एक प्रोटोकॉल है जो एक अनुबंध को परिभाषित करता है, जबकि Component एक वर्ग है जो इस प्रोटोकॉल को लागू करता है। पंजीकरण register विधि का उपयोग करके किया जाता है, जो सेवा प्रकार और एक फैक्ट्री लेता है।
let container = Container()
container.register(Networking.self) { _ in
NetworkService()
}
let service = container.resolve(Networking.self)
resolve विधि निर्दिष्ट प्रोटोकॉल के लिए पंजीकृत ठोस कार्यान्वयन का एक इंस्टेंस लौटाती है। यदि कोई निर्भरता पंजीकृत नहीं है, तो कंटेनर विकास के दौरान त्वरित समस्या का पता लगाने के लिए एक फैटल एरर फेंकता है।
प्रत्येक पंजीकरण एक फैक्ट्री फ़ंक्शन और चयनित स्कोप के साथ एक प्रविष्टि बनाता है। एक सेवा में विभिन्न नामों के साथ कई पंजीकरण हो सकते हैं, जिससे आप नाम के आधार पर एक विशिष्ट कार्यान्वयन चुन सकते हैं — विभिन्न वातावरणों (डेवलपमेंट, स्टेजिंग, प्रोडक्शन) के लिए उपयोगी।
निर्भरता समाधान प्रक्रिया पुनरावर्ती रूप से काम करती है: जब कंटेनर एक Component इंस्टेंस बनाता है, तो यह अपने इनिशियलाइज़र का विश्लेषण करता है और प्रत्येक पैरामीटर के लिए संबंधित प्रकार के साथ resolve को कॉल करता है। यदि किसी निर्भरता की भी अपनी निर्भरताएँ हैं, तो प्रक्रिया तब तक जारी रहती है जब तक पूरा ग्राफ पूरी तरह से नहीं बन जाता। नेस्टिंग गहराई केवल उपलब्ध मेमोरी द्वारा सीमित है, लेकिन व्यवहार में शायद ही कभी पाँच स्तरों से अधिक होती है।
Swinject तीन मुख्य निर्भरता इंजेक्शन विधियों का समर्थन करता है, प्रत्येक आर्किटेक्चरल संदर्भ के आधार पर लागू होता है।
Constructor Injection इनिशियलाइज़र पैरामीटर के माध्यम से निर्भरताएँ इंजेक्ट करता है। यह पसंदीदा विधि है, जो सुनिश्चित करती है कि एक ऑब्जेक्ट निर्माण के क्षण से हमेशा मान्य स्थिति में हो। Swinject कंस्ट्रक्टर को पारित सभी निर्भरताओं को स्वचालित रूप से हल करता है।
class LoginViewModel {
private let authService: AuthProtocol
init(authService: AuthProtocol) {
self.authService = authService
}
}
container.register(AuthProtocol.self) { _ in
AuthService()
}
container.register(LoginViewModel.self) { r in
LoginViewModel(authService: r.resolve(AuthProtocol.self)!)
}
Property Injection इनिशियलाइज़ेशन के बाद ऑब्जेक्ट गुण सेट करके निर्भरताएँ इंजेक्ट करता है। इसका उपयोग तब किया जाता है जब कोई निर्भरता वैकल्पिक हो या कंस्ट्रक्टर के माध्यम से पारित नहीं की जा सकती, उदाहरण के लिए, Storyboard के साथ काम करते समय, जहाँ view controller स्वचालित रूप से बनाया जाता है। Swinject स्पष्ट resolve कॉल के बिना रनटाइम पर स्वचालित प्रॉपर्टी इंजेक्शन के लिए @Inject एनोटेशन का समर्थन करता है।
Property Injection का उपयोग करते समय, यह सुनिश्चित करना महत्वपूर्ण है कि ऑब्जेक्ट तक पहली पहुँच से पहले निर्भरता सेट की गई हो। अन्यथा, प्रॉपर्टी nil रहेगी, जिससे अप्रत्याशित क्रैश होगा। Swinject Implicitly Unwrapped Optional तंत्र और निर्भरता ग्राफ समाधान चरण में सख्त सत्यापन के माध्यम से इस समस्या को हल करता है।
Method Injection मेथड पैरामीटर के माध्यम से निर्भरताएँ इंजेक्ट करता है। इसका उपयोग उन सेवाओं के लिए किया जाता है जो केवल एक ऑपरेशन करने के लिए आवश्यक होती हैं और ऑब्जेक्ट की स्थायी स्थिति के रूप में संग्रहीत नहीं होनी चाहिए। यह सबसे कम सामान्य लेकिन कॉलबैक के लिए उपयोगी विधि है।
ObjectScope एक तंत्र है जो Swinject कंटेनर के अंदर बनाए गए इंस्टेंस के जीवनकाल को निर्धारित करता है। फ्रेमवर्क ObjectScopeProtocol के माध्यम से कस्टम स्कोप बनाने की क्षमता के साथ तीन अंतर्निहित स्कोप प्रदान करता है।
graph स्कोप डिफ़ॉल्ट मान है। प्रत्येक resolve कॉल एक नया इंस्टेंस बनाता है जो केवल निर्भरता ग्राफ समाधान की अवधि के लिए जीवित रहता है। यह स्टेटलेस सेवाओं के लिए एक सुरक्षित विकल्प है क्योंकि यह कैशिंग से मेमोरी लीक को समाप्त करता है।
container स्कोप कंटेनर के भीतर एक सिंगलटन है। इंस्टेंस पहले resolve पर एक बार बनाया जाता है और बाद के सभी अनुरोधों पर लौटाया जाता है। साझा स्थिति वाली सेवाओं के लिए उपयुक्त: डेटा कैश, लॉगर, एप्लिकेशन सेटिंग्स।
transient स्कोप प्रत्येक resolve कॉल पर बिना कैशिंग के एक नया इंस्टेंस बनाता है। हल्के ऑब्जेक्ट के लिए उपयोग किया जाता है जिन्हें पुनः उपयोग करने की आवश्यकता नहीं होती — उदाहरण के लिए, एक विशिष्ट HTTP अनुरोध को संभालने वाले मॉड्यूल।
| स्कोप | जीवनकाल | अनुशंसित उपयोग |
|---|---|---|
| graph | ग्राफ समाधान की अवधि के लिए | स्टेटलेस सेवाएँ डिफ़ॉल्ट रूप से |
| container | कंटेनर का पूरा जीवनकाल | सिंगलटन: कैश, लॉगर, नेटवर्क क्लाइंट |
| transient | कोई कैशिंग नहीं | एकल उपयोग के लिए हल्के ऑब्जेक्ट |
वास्तविक iOS प्रोजेक्ट में Swinject को एकीकृत करना एप्लिकेशन लॉन्च पर कंटेनर को इनिशियलाइज़ करने से शुरू होता है — AppDelegate या सीन में। Assembly के माध्यम से पंजीकरण को संरचित करने की अनुशंसा की जाती है: एक अलग वर्ग या संरचना जो संबंधित सेवाओं को समूहित करती है।
Swift Developer Community सर्वेक्षण (2025) के अनुसार, 43% iOS डेवलपर वाणिज्यिक प्रोजेक्ट्स में नेटवर्क लेयर, रिपॉजिटरी और नेविगेशन कोऑर्डिनेटर की निर्भरताओं को प्रबंधित करने के लिए DI कंटेनर का उपयोग करते हैं। Swinject अपने न्यूनतम सिंटैक्स और Objective-C संगतता के कारण सबसे लोकप्रिय समाधान बना हुआ है।
Storyboard Injection Swinject की एक अनूठी विशेषता है: कंटेनर AppDelegate में अतिरिक्त कोड के बिना Storyboard से बनाए गए view controller में स्वचालित रूप से निर्भरताएँ इंजेक्ट करता है। यह init(container:) विधि के माध्यम से UIStoryboard को पारित एक विशेष resolver का उपयोग करता है, जो view controller निर्माण को रोकता है और पंजीकृत निर्भरताओं को इंजेक्ट करता है।
बड़े प्रोजेक्ट्स में, Swinject को नेविगेशन कोऑर्डिनेटर के साथ जोड़ा जा सकता है: कोऑर्डिनेटर कंटेनर प्राप्त करता है और resolve के माध्यम से उनकी निर्भरताओं को हल करके स्क्रीन बनाता है, पूरे सीन के लिए एक एकल कॉन्फ़िगरेशन बिंदु बनाए रखता है।
Assembly आर्किटेक्चर पंजीकरण आयोजित करने के लिए अनुशंसित पैटर्न है। प्रत्येक Assembly संबंधित सेवाओं को समूहित करता है (जैसे, NetworkingAssembly, DatabaseAssembly) और अन्य Assembly पर निर्भर हो सकता है। कंटेनर को इनिशियलाइज़ करते समय, सभी Assembly लोड होते हैं और अपनी सेवाएँ पंजीकृत करते हैं, जिम्मेदारियों का स्पष्ट पृथक्करण प्रदान करते हैं और दर्जनों सेवाओं वाले बड़े प्रोजेक्ट्स में DI कॉन्फ़िगरेशन के माध्यम से नेविगेशन को सरल बनाते हैं।
DI ग्राफ की डिबगिंग के लिए, Swinject SwinjectPropertyLoader एक्सटेंशन प्रदान करता है, जो plist फ़ाइल से कॉन्फ़िगरेशन लोड करता है, और SwinjectStoryboard — UIStoryboard के एक विशेष संस्करण के माध्यम से स्टोरीबोर्ड एकीकरण। ये उपकरण विशेष रूप से तब उपयोगी होते हैं जब किसी मौजूदा प्रोजेक्ट को मैन्युअल ऑब्जेक्ट निर्माण से DI में माइग्रेट किया जाता है: डेवलपर धीरे-धीरे सेवाओं को पंजीकृत कर सकता है, मुख्य फीचर विकास को रोके बिना परीक्षण और समाधान त्रुटि लॉगिंग के माध्यम से निर्भरता ग्राफ की जाँच कर सकता है।
Swinject स्पष्ट फैक्ट्री पंजीकरण के बिना इनिशियलाइज़र पैरामीटर प्रकारों के आधार पर स्वचालित निर्भरता समाधान के लिए SwinjectAutoregistration एक्सटेंशन के माध्यम से RxSwift और Combine के साथ एकीकरण भी प्रदान करता है। यह सरल सेवाओं के लिए पंजीकरण कोड की मात्रा को कम करता है: बस फैक्ट्री निर्दिष्ट किए बिना container.register(ServiceProtocol.self) कॉल करें, और Swinject Swift रनटाइम द्वारा प्रदान किए गए Signal रिफ्लेक्शन के आधार पर स्वचालित रूप से फैक्ट्री बनाएगा। यह दृष्टिकोण उन सेवाओं के लिए अनुशंसित है जिनके कंस्ट्रक्टर केवल बुनियादी प्रकार स्वीकार करते हैं और जटिल निर्माण तर्क की आवश्यकता नहीं होती।
अक्सर पूछे जाने वाले प्रश्न
Swinject कोड जनरेशन या रिफ्लेक्शन के बिना शुद्ध Swift में लिखा गया है। Needle के विपरीत, इसे स्रोत जनरेशन की आवश्यकता नहीं है, और Dip की तुलना में, यह अंतर्निहित Storyboard Injection समर्थन प्रदान करता है, जो मौजूदा UIKit प्रोजेक्ट्स में एकीकरण को सरल बनाता है।
File — Add Packages मेनू में Xcode के माध्यम से URL github.com/Swinject/Swinject द्वारा पैकेज जोड़ें। CocoaPods और Carthage के माध्यम से भी स्थापना उपलब्ध है। स्थापना के बाद, Swinject मॉड्यूल आयात करें और Container इंस्टेंस बनाएं।
हाँ, Swinject SwiftUI के साथ पूरी तरह से संगत है। निर्भरताएँ View इनिशियलाइज़र या Environment के माध्यम से इंजेक्ट की जाती हैं, जहाँ कंटेनर को EnvironmentObject के रूप में पारित किया जाता है। Swinject UIKit पर निर्भर नहीं करता और दोनों फ्रेमवर्क के साथ समान रूप से काम करता है।
परीक्षणों के लिए एक अलग कंटेनर बनाएं, वास्तविक सेवाओं को मॉक से बदलें। Swinject उपभोक्ता कोड को बदले बिना पंजीकरण को ओवरराइड करने की अनुमति देता है। प्रत्येक परीक्षण को न्यूनतम निर्भरता सेट के साथ एक पृथक कंटेनर मिलता है।
एनालिटिक्स के लिए, container स्कोप का उपयोग करें ताकि सभी स्क्रीन एक इंस्टेंस के माध्यम से ईवेंट भेजें। यह एकीकृत भेजने की कतार और विभिन्न उपभोक्ताओं के बीच डेटा दोहराव के बिना सही बैच एग्रीगेशन संचालन की गारंटी देता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें