Swinject: Swift (iOS/macOS) के लिए Dependency Injection कंटेनर

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

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

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

Swinject — Swift (iOS/macOS) के लिए Dependency Injection कंटेनर

Dependency Injection (DI) SOLID सिद्धांतों में से एक महत्वपूर्ण सिद्धांत है, जो आपको कमजोर रूप से जुड़ा, टेस्टेबल और स्केलेबल कोड बनाने में मदद करता है। Swift में iOS और macOS डेवलपमेंट के लिए DI को लागू करने वाली सबसे लोकप्रिय लाइब्रेरी में से एक Swinject है। यह एक हल्का लेकिन शक्तिशाली डिपेंडेंसी इंजेक्शन कंटेनर है, जो ऑब्जेक्ट्स और उनके जीवनचक्र को प्रबंधित करना आसान बनाता है।

इस लेख में, हम विस्तार से जानेंगे कि Swinject कैसे काम करता है, इसे कैसे इंस्टॉल करें और वास्तविक प्रोजेक्ट्स में इसका उपयोग कैसे करें।

Dependency Injection क्या है और कंटेनर की आवश्यकता क्यों है?

डिपेंडेंसी इंजेक्शन एक तकनीक है जिसमें कोई ऑब्जेक्ट अपनी डिपेंडेंसी को खुद बनाने के बजाय बाहर से प्राप्त करता है। इससे लचीलापन बढ़ता है और टेस्टिंग आसान हो जाती है। DI कंटेनर (जैसे Swinject) ऑब्जेक्ट्स को बनाने और जोड़ने की प्रक्रिया को स्वचालित करता है, जिससे डेवलपर को boilerplate कोड लिखने से मुक्ति मिलती है।

Swinject की स्थापना

Swinject को Swift Package Manager, CocoaPods या Carthage के माध्यम से इंस्टॉल किया जा सकता है। आइए सबसे आधुनिक तरीका देखें — SPM:

// Xcode में: File → Swift Packages → Add Package Dependency
// URL: https://github.com/Swinject/Swinject.git
// वर्जन: 2.8.0 और उससे ऊपर

या Package.swift में जोड़ें:

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

Swinject के मुख्य घटक

  • Container — मुख्य ऑब्जेक्ट जिसमें डिपेंडेंसी रजिस्टर और रिज़ॉल्व की जाती हैं।
  • Service — वह टाइप (प्रोटोकॉल या क्लास) जिसे हम इंजेक्ट करना चाहते हैं।
  • Registration — एब्स्ट्रैक्शन (प्रोटोकॉल) को एक विशिष्ट इम्प्लीमेंटेशन से जोड़ने की प्रक्रिया।
  • Scope — ऑब्जेक्ट के जीवनचक्र को नियंत्रित करता है (ट्रांज़िएंट, सिंगलटन, आदि)।

बुनियादी उपयोग का उदाहरण

मान लीजिए हमारे पास एक प्रोटोकॉल NetworkServiceProtocol और इसका इम्प्लीमेंटेशन NetworkService है:

import Swinject

protocol NetworkServiceProtocol {
    func fetchData() -> String
}

class NetworkService: NetworkServiceProtocol {
    func fetchData() -> String {
        return "डेटा प्राप्त हुआ"
    }
}

// कंटेनर बनाएँ
let container = Container()

// डिपेंडेंसी रजिस्टर करें
container.register(NetworkServiceProtocol.self) { _ in NetworkService() }

// इंस्टेंस प्राप्त करें (रिज़ॉल्व)
let service = container.resolve(NetworkServiceProtocol.self)!
print(service.fetchData()) // "डेटा प्राप्त हुआ"

ViewController (iOS) में डिपेंडेंसी इंजेक्शन

अक्सर Swinject का उपयोग कंट्रोलर में सर्विसेज़ इंजेक्ट करने के लिए किया जाता है। आइए एक व्यू-मॉडल का उदाहरण देखें:

import Swinject

// व्यू-मॉडल का प्रोटोकॉल और इम्प्लीमेंटेशन
protocol UserViewModelProtocol {
    func getUsers() -> [String]
}

class UserViewModel: UserViewModelProtocol {
    private let networkService: NetworkServiceProtocol
    
    init(networkService: NetworkServiceProtocol) {
        self.networkService = networkService
    }
    
    func getUsers() -> [String] {
        // networkService का उपयोग करके डेटा लोड करें
        return ["राम", "श्याम"]
    }
}

// कंटेनर में रजिस्टर करें
container.register(UserViewModelProtocol.self) { resolver in
    let network = resolver.resolve(NetworkServiceProtocol.self)!
    return UserViewModel(networkService: network)
}

// कंट्रोलर में उपयोग
class UsersViewController: UIViewController {
    var viewModel: UserViewModelProtocol?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        viewModel = container.resolve(UserViewModelProtocol.self)
        print(viewModel?.getUsers() ?? [])
    }
}

ऑब्जेक्ट्स के जीवनचक्र (Scopes)

Swinject कई scopes को सपोर्ट करता है:

  • .transient — हर बार एक नया इंस्टेंस बनाया जाता है (डिफ़ॉल्ट)।
  • .container — कंटेनर के जीवनकाल में एक ही इंस्टेंस (सिंगलटन)।
  • .graph — एक ग्राफ़ में सभी डिपेंडेंसी के लिए एक ही इंस्टेंस शेयर होता है।

उदाहरण के लिए, सिंगलटन बनाने के लिए:

container.register(NetworkServiceProtocol.self) { _ in NetworkService() }
    .inObjectScope(.container)

निष्कर्ष

Swinject Swift डेवलपर्स के लिए एक शक्तिशाली और लचीला DI कंटेनर है। यह कोड को अधिक मॉड्यूलर, टेस्टेबल और मेंटेन करने योग्य बनाता है। चाहे आप iOS या macOS ऐप बना रहे हों, Swinject आपकी डिपेंडेंसी मैनेजमेंट को सरल बना सकता है। अधिक जानकारी के लिए आधिकारिक GitHub रिपॉजिटरी देखें।

अनुशंसाएँ