Android
लाइब्रेरी डैगर 2: अनुप्रयोगों में निर्भरता इंजेक्शन
खोज…
परिचय
Ditger 2, जैसा कि GitHub पर समझाया गया है , निर्भरता इंजेक्शन के लिए एक संकलन-समय विकास दृष्टिकोण है। डैगर 1.x में शुरू किए गए दृष्टिकोण को अपने अंतिम निष्कर्ष तक ले जाना, डैगर 2.x सभी प्रतिबिंब को समाप्त करता है, और उपयोगकर्ता द्वारा निर्दिष्ट @Component
इंटरफेस के पक्ष में पारंपरिक ObjectGraph
/ Injector
को हटाकर कोड स्पष्टता में सुधार करता है।
टिप्पणियों
- आवेदन में लाइब्रेरी सेटअप (मावेन, ग्रेडेल, जावा परियोजनाओं के लिए)
- ड्रैगर उपयोग के लाभ
- महत्वपूर्ण लिंक (प्रलेखन और डेमो के लिए)
- ड्रैगर घटकों को कैसे एकीकृत और उपयोग करें
डैगर 2 एपीआई:
डैगर 2 कई विशेष एनोटेशन को उजागर करता है:
@ जिन वर्गों के तरीकों पर निर्भरता प्रदान की जाती है, उनके लिए नियमन
@Module कक्षाओं के भीतर तरीकों के लिए प्रदान करता है
@ एक निर्भरता का अनुरोध करने के लिए (एक निर्माता, एक क्षेत्र, या एक विधि)
@Component मॉड्यूल और इंजेक्शन के बीच एक ब्रिज इंटरफेस है
महत्वपूर्ण लिंक:
GitHub: https://github.com/google/dagger
UserGuide (Google): https://google.github.io/dagger/users-guide.html
वीडियो: https://google.github.io/dagger/resources.html
वोगेला ट्यूटोरियल: http://www.vogella.com/tutorials/Dagger/article.html
कोडपथ ट्यूटोरियल: https://github.com/codepath/android_guides/wiki/D dependency-Injection-with-Dagger-2
ऑब्जेक्ट के लिए @Module क्लास और @Singleton एनोटेशन बनाएं
import javax.inject.Singleton;
import dagger.Module;
import dagger.Provides;
@Module
public class VehicleModule {
@Provides @Singleton
Motor provideMotor(){
return new Motor();
}
@Provides @Singleton
Vehicle provideVehicle(){
return new Vehicle(new Motor());
}
}
हर प्रदाता (या विधि) के पास @Provides
एनोटेशन होना चाहिए और क्लास के पास @Module
एनोटेशन होना चाहिए। @Singleton
एनोटेशन इंगित करता है कि ऑब्जेक्ट का केवल एक उदाहरण होगा।
आश्रित वस्तुओं में निर्भरता का अनुरोध करें
अब जब आपके पास अपने विभिन्न मॉडलों के लिए प्रदाता हैं, तो आपको उन्हें अनुरोध करने की आवश्यकता है। जिस प्रकार Vehicle
को Motor
आवश्यकता होती है, आपको Vehicle
निर्माता में @Inject
एनोटेशन को इस प्रकार जोड़ना होगा:
@Inject
public Vehicle(Motor motor){
this.motor = motor;
}
आप कंस्ट्रक्टर, फ़ील्ड्स, या विधियों में निर्भरता का अनुरोध करने के लिए @Inject
एनोटेशन का उपयोग कर सकते हैं। इस उदाहरण में, मैं कंस्ट्रक्टर में इंजेक्शन रख रहा हूं।
@Inject के साथ @Modules को कनेक्ट करना
निर्भरता के प्रदाता, @Module
और @Inject
माध्यम से उनसे अनुरोध करने वाली कक्षाओं के बीच का कनेक्शन @Inject
का उपयोग करके बनाया @Component
, जो एक इंटरफ़ेस है:
import javax.inject.Singleton;
import dagger.Component;
@Singleton
@Component(modules = {VehicleModule.class})
public interface VehicleComponent {
Vehicle provideVehicle();
}
@Component
एनोटेशन के लिए, आपको यह निर्दिष्ट करना होगा कि कौन से मॉड्यूल का उपयोग किया जा रहा है। इस उदाहरण में VehicleModule
का उपयोग किया जाता है, जिसे इस उदाहरण में परिभाषित किया गया है । यदि आपको अधिक मॉड्यूल का उपयोग करने की आवश्यकता है, तो बस उन्हें विभाजक के रूप में अल्पविराम का उपयोग करके जोड़ें।
वस्तुओं को प्राप्त करने के लिए @Component इंटरफ़ेस का उपयोग करना
अब जब आपके पास हर कनेक्शन तैयार है, तो आपको इस इंटरफ़ेस का एक उदाहरण प्राप्त करना होगा और अपनी ज़रूरत की वस्तु प्राप्त करने के लिए इसके तरीकों को लागू करना होगा:
VehicleComponent component = Dagger_VehicleComponent.builder().vehicleModule(new VehicleModule()).build();
vehicle = component.provideVehicle();
Toast.makeText(this, String.valueOf(vehicle.getSpeed()), Toast.LENGTH_SHORT).show();
जब आप @Component
एनोटेशन के साथ इंटरफ़ेस का एक नया ऑब्जेक्ट बनाने का प्रयास करते हैं, तो आपको यह करना होगा उपसर्ग Dagger_<NameOfTheComponentInterface>
का उपयोग करके, इस मामले में Dagger_VehicleComponent
, और उसके बाद हर मॉड्यूल को कॉल करने के लिए बिल्डर पद्धति का उपयोग करें।