घटक निर्भरता बनाम खंजर 2 उपकेंद्रों


135

डैगर 1 की plus()विधि कुछ ऐसी है जिसका मैंने पिछले अनुप्रयोगों में काफी बार उपयोग किया है, इसलिए मैं उन स्थितियों को समझता हूं, जहां आप मूल ग्राफ़ बाइंडिंग के लिए पूर्ण पहुंच के साथ एक उपसमुच्चय चाहते हैं।

किस स्थिति में उप-निर्भर निर्भरता के बजाय घटक निर्भरता का उपयोग करना फायदेमंद होगा और क्यों?

जवाबों:


228

घटक निर्भरता - जब आप दो घटकों को स्वतंत्र रखना चाहते हैं तो इसका उपयोग करें।

उपसंपादक - इसका उपयोग तब करें जब आप दो घटकों को युग्मित रखना चाहते हैं।


मैं घटक निर्भरता और सब- कम्यूटर को समझाने के लिए नीचे दिए गए उदाहरण का उपयोग करूंगा । उदाहरण के बारे में ध्यान देने योग्य कुछ बिंदु हैं:

  • SomeClassA1बिना किसी निर्भरता के बनाया जा सकता है। ModuleAप्रदान करता है और विधि के SomeClassA1माध्यम से उदाहरण provideSomeClassA1()
  • SomeClassB1के बिना नहीं बनाया जा सकता SomeClassA1। केवल ModuleBएक उदाहरण प्रदान कर सकता है SomeClassB1यदि एक उदाहरण विधि के SomeClassA1तर्क के रूप में पारित किया जाता है provideSomeClassB1()
@Module
public class ModuleA {
    @Provides
    public SomeClassA1 provideSomeClassA1() {
        return new SomeClassA1();
    }
}

@Module
public class ModuleB {
    @Provides
    public SomeClassB1 provideSomeClassB1(SomeClassA1 someClassA1) {
        return new SomeClassB1(someClassA1);
    }
}

public class SomeClassA1 {
    public SomeClassA1() {}
}

public class SomeClassB1 {
    private SomeClassA1 someClassA1;

    public SomeClassB1(SomeClassA1 someClassA1) {
        this.someClassA1 = someClassA1;
    }
}

डैगर के कहने गुजर का ख्याल रखना होगा SomeClassA1करने के लिए एक तर्क के रूप provideSomeClassB1()में विधि ModuleBजब भी घटक / उप-घटक घोषणा ModuleBआरंभ नहीं हो जाता। हमें डैगर को निर्देश देने की आवश्यकता है कि निर्भरता को कैसे पूरा किया जाए। यह या तो घटक निर्भरता या उपसंयोजक का उपयोग करके किया जा सकता है ।

घटक निर्भरता

घटक निर्भरता उदाहरण में निम्नलिखित बातों पर ध्यान दें:

  • ComponentBएनोटेशन dependenciesपर विधि के माध्यम से निर्भरता को परिभाषित करना है @Component
  • ComponentAघोषित करने की आवश्यकता नहीं है ModuleB। यह दो घटकों को स्वतंत्र रखता है।
public class ComponentDependency {
    @Component(modules = ModuleA.class)
    public interface ComponentA {
        SomeClassA1 someClassA1();
    }

    @Component(modules = ModuleB.class, dependencies = ComponentA.class)
    public interface ComponentB {
        SomeClassB1 someClassB1();
    }

    public static void main(String[] args) {
        ModuleA moduleA = new ModuleA();
        ComponentA componentA = DaggerComponentDependency_ComponentA.builder()
                .moduleA(moduleA)
                .build();

        ModuleB moduleB = new ModuleB();
        ComponentB componentB = DaggerComponentDependency_ComponentB.builder()
                .moduleB(moduleB)
                .componentA(componentA)
                .build();
    }
}

उप-घटक

निम्नलिखित बिंदुओं को SubComponent उदाहरण में नोट करें:

  • जैसा ComponentBकि निर्भरता को परिभाषित नहीं किया गया है ModuleA, यह स्वतंत्र रूप से नहीं रह सकता है। यह उस घटक पर निर्भर हो जाता है जो प्रदान करेगा ModuleA। इसलिए इसमें एक @Subcomponentएनोटेशन है।
  • ComponentAModuleBइंटरफ़ेस विधि के माध्यम से घोषित किया गया है componentB()। यह दो घटकों को युग्मित करता है। वास्तव में, ComponentBकेवल के माध्यम से आरंभ किया जा सकता है ComponentA
public class SubComponent {
    @Component(modules = ModuleA.class)
    public interface ComponentA {
        ComponentB componentB(ModuleB moduleB);
    }

    @Subcomponent(modules = ModuleB.class)
    public interface ComponentB {
        SomeClassB1 someClassB1();
    }

    public static void main(String[] args) {
        ModuleA moduleA = new ModuleA();
        ComponentA componentA = DaggerSubComponent_ComponentA.builder()
                .moduleA(moduleA)
                .build();

        ModuleB moduleB = new ModuleB();
        ComponentB componentB = componentA.componentB(moduleB);
    }
}

4
मेरे पास एक सबकोम्पोनेंट सेटअप है जो मॉड्यूल बी को कंपोनेंटए में नहीं जोड़ता है, जिसका अर्थ है कि कंपोनेंट बिल्डर को मॉड्यूलबी की आवश्यकता नहीं है। यह उस तरीके से काम करने लगता है जिस तरह से मुझे उम्मीद थी कि आवेदन शुरू होने पर कंपोनेंटा बनाने की इजाजत होगी और फिर तुरंत एम
फ्रेंडलीमिखल

2
@ मायकेएन - क्या आप इस बात पर प्रकाश डाल सकते हैं कि आप कंपोनेंट पर मॉड्यूल से कैसे छुटकारा पा सकते हैं? मैं CompuleA पर ModuleB से छुटकारा तभी पा सकता हूँ, जब मैं ComponentA और ComponentB पर अलग-अलग स्कोप प्रदान करता हूँ।
प्रवीर गुप्ता

1
आप सही हैं मेरा सेटअप काम करता है क्योंकि वे अलग-अलग दायरे में हैं। क्षमा याचना।
फ्रेंडलीमिखेल

2
" SomeClassB1पर निर्भर है SomeClassA1ComponentAस्पष्ट रूप से निर्भरता को परिभाषित किया है।" ==> क्या आपका मतलब है " ComponentBनिर्भरता को स्पष्ट रूप से परिभाषित करना है"?
तार

1
इसी तरह @Tar ने बताया, मैं समझता हूं कि " SomeClassB1पर निर्भर है SomeClassA1ComponentAस्पष्ट रूप से निर्भरता को परिभाषित करने की आवश्यकता नहीं है।" आपका मतलब था " ComponentBनिर्भरता को स्पष्ट रूप से परिभाषित करने की आवश्यकता नहीं है।"
सेबास एलजी

45

प्रलेखन के अनुसार :

Component Dependencyआपको घटक निर्भरता के माध्यम से प्रावधान विधियों के रूप में उजागर केवल बाइंडिंग तक पहुंच प्रदान करता है, अर्थात आपके पास केवल उन प्रकारों तक पहुंच होती है जो माता-पिता में घोषित होते हैं Component

SubComponentयह घोषित होने पर आपको अपने माता-पिता से पूरे बाध्यकारी ग्राफ तक पहुंच प्रदान करता है, यानी आपके पास इसके Moduleएस में घोषित सभी वस्तुओं तक पहुंच है ।

आइए कहते हैं, आप एक ApplicationComponentसब युक्त Androidसंबंधित सामान ( LocationService, Resources, SharedPreference, आदि)। आप यह भी चाहते हैं कि एपीआई के साथ सौदा करने के DataComponentलिए आप जहां दृढ़ता के लिए चीजों का प्रबंधन WebServiceकरते हैं। केवल एक चीज जिसकी आपमें कमी DataComponentहै Application Context, वह है ApplicationComponent। सबसे आसान तरीका है एक पाने के लिए Contextसे DataComponentपर निर्भरता होगा ApplicationComponent। आपको यह सुनिश्चित करने की आवश्यकता है कि आपके पास Contextस्पष्ट रूप से घोषित किया गया है ApplicationComponentक्योंकि आपके पास केवल घोषित सामान तक पहुंच है। इस मामले में, कोई मैनुअल काम नहीं है, जिसका अर्थ है कि आपको Submodulesमाता Component- पिता में निर्दिष्ट करने की आवश्यकता नहीं है और स्पष्ट रूप से अपने सबमॉडल को मूल मॉड्यूल में जोड़ें:

MySubcomponent mySubcomponent = myComponent.plus(new ChildGraphModule("child!")); // No need!

अब जब कि इस मामले में जहां आप इंजेक्षन करना चाहते हैं पर विचार WebServiceसे DataComponentऔर LocationServiceसे ApplicationComponentअपने में Fragmentउपयोग करते हुए जो बांध @Submodule plusऊपर सुविधा। यहाँ पर ठंडी बात यह है कि जिस घटक से आप बंधे हुए हैं ( ApplicationComponent) को तो एक्सपोज़ करने की आवश्यकता है WebServiceऔर न ही LocationServiceआपके पास पूरे ग्राफ तक पहुँच है।


2
अगर मैं सही ढंग से समझूं, तो कोई इंटरफ़ेस नहीं है @Submodule। क्या यह एक टाइपो है?
इस्लाम सलाह

मुझे पसंद है कि यह अंतर दिखाने के लिए एक वास्तविक जीवन उदाहरण का उपयोग कैसे करता है। हालाँकि, यह डॉक्स पढ़ने की तुलना में अधिक भ्रामक है। यह classesउदाहरण के रूप में कम और सटीक बिंदु को चित्रित करने के लिए अधिक चित्रों के लिए मदद करेगा ।
सूडोकोडर

18

यहाँ घटक और उप-समूह की अधिक समझ के लिए स्क्रीनशॉट के साथ कोड उदाहरण है:

घटक: यहाँ छवि विवरण दर्ज करें

  1. AppComponent में दो घोषणाएँ शामिल हैं।
  2. AppComponent ऐप क्लास में इनिशियलाइज़ करता है।
  3. HomeActivityComponent, AppComponent पर निर्भर है।
  4. DaggerHomeActivityComponent के आरंभ पर HomeActivity में, मैं एक रचना के रूप में AppComponent ऑब्जेक्ट दे रहा हूं।

उप-घटक:

यहाँ छवि विवरण दर्ज करें

  1. AppComponent में SubComponent या SubCompords होते हैं।
  2. AppComponent ऐप क्लास में इनिशियलाइज़ करता है।
  3. SubComponent को उसके ParentComponent के बारे में नहीं पता होता है। यह केवल मॉड्यूल को शामिल करके अपनी निर्भरता प्रदान करता है।
  4. HomeActivity में मैं अपने पैरेंट कंपोनेंट का उपयोग करके SubComponent को इंजेक्ट कर रहा हूं।

और चित्रमय आरेख: यहाँ छवि विवरण दर्ज करें

स्रोत: लिंक


यदि उपकेंद्रण AppComponent संलग्न है, तो आरेख अधिक समझ में नहीं आएगा?
फ्लोरियन वाल्थर

1

एक और बात जो मुझे अब तक महसूस नहीं हुई, वह है:

  • एक @Subcomponentउदाहरण में वास्तव में एक मूल घटक होता है (हालाँकि विभिन्न घटक एक ही @Subcomponentहो सकते हैं और उसी उदाहरण के माता-पिता हो सकते हैं)
  • एक @Componentशून्य, एक या कई "जनक" घटकों के माध्यम से घोषित हो सकता है घटक निर्भरता

1
संभवतः दूसरे मामले में यह कहना सही नहीं है कि '@Component' में माता-पिता हो सकते हैं। बल्कि '@Component' के कोई माता-पिता नहीं हैं, लेकिन अन्य घटक निर्भरता के माध्यम से उस पर निर्भर हो सकते हैं (बस इसका उपयोग करें)।
डेमासी

@demaksee मुझे नहीं पता, यह मुझे लगता है कि यदि आप अपने घटक पदानुक्रम को बाहर करते हैं, तो आप डीएजी से मिलेंगे, और मुझे लगता है कि यह इस संबंध को ग्राफ संदर्भ में माता-पिता के रूप में संदर्भित करने के लिए एक मानक तरीका है। यदि हम डैगर के आंतरिक कामकाज के बारे में बात कर रहे हैं, तो मुझे लगता है कि यह सही शब्द नहीं हो सकता है।
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.