كيفية إعداد حقن التبعية DAGGER من الصفر في مشروع Android؟



Answers

دليل 1.x خنجر :

الخطوات هي التالية:

1.) إضافة Dagger إلى ملف build.gradle أجل التبعيات

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    ...
    compile 'com.squareup.dagger:dagger:1.2.2'
    provided 'com.squareup.dagger:dagger-compiler:1.2.2'

أضف أيضًا packaging-option لمنع حدوث خطأ في ملفات duplicate APKs .

android {
    ...
    packagingOptions {
        // Exclude file to avoid
        // Error: Duplicate files during packaging of APK
        exclude 'META-INF/services/javax.annotation.processing.Processor'
    }
}

2.) إنشاء فئة Injector لمعالجة ObjectGraph .

public enum Injector
{
    INSTANCE;

    private ObjectGraph objectGraph = null;

    public void init(final Object rootModule)
    {

        if(objectGraph == null)
        {
            objectGraph = ObjectGraph.create(rootModule);
        }
        else
        {
            objectGraph = objectGraph.plus(rootModule);
        }

        // Inject statics
        objectGraph.injectStatics();

    }

    public void init(final Object rootModule, final Object target)
    {
        init(rootModule);
        inject(target);
    }

    public void inject(final Object target)
    {
        objectGraph.inject(target);
    }

    public <T> T resolve(Class<T> type)
    {
        return objectGraph.get(type);
    }
}

3.) إنشاء RootModule لربط RootModule المستقبلية معًا. يرجى ملاحظة أنه يجب تضمين injects لتحديد كل فئة ستستخدم @Inject التعليق التوضيحي @Inject ، لأنه بخلاف ذلك يلقي Dagger RuntimeException .

@Module(
    includes = {
        UtilsModule.class,
        NetworkingModule.class
    },
    injects = {
        MainActivity.class
    }
)
public class RootModule
{
}

4.) في حالة وجود وحدات فرعية أخرى داخل وحداتك المحددة في الجذر ، قم بإنشاء وحدات نمطية لتلك الوحدات:

@Module(
    includes = {
        SerializerModule.class,
        CertUtilModule.class
    }
)
public class UtilsModule
{
}

5.) إنشاء وحدات أوراق التي تتلقى التبعيات كمعلمات منشئ. في حالتي ، لم يكن هناك تبعية دائرية ، لذلك لا أعرف ما إذا كان خنجر يستطيع حل ذلك ، لكني أجد أنه من غير المحتمل. يجب أيضًا توفير معلمات المُنشئ في وحدة نمطية بواسطة Dagger ، إذا قمت بتحديد complete = false فقد يكون ذلك في وحدات نمطية أخرى أيضًا.

@Module(complete = false, library = true)
public class NetworkingModule
{
    @Provides
    public ClientAuthAuthenticator providesClientAuthAuthenticator()
    {
        return new ClientAuthAuthenticator();
    }

    @Provides
    public ClientCertWebRequestor providesClientCertWebRequestor(ClientAuthAuthenticator clientAuthAuthenticator)
    {
        return new ClientCertWebRequestor(clientAuthAuthenticator);
    }

    @Provides
    public ServerCommunicator providesServerCommunicator(ClientCertWebRequestor clientCertWebRequestor)
    {
        return new ServerCommunicator(clientCertWebRequestor);
    }
}

6.) تمديد Application وتهيئة Injector .

@Override
public void onCreate()
{
    super.onCreate();
    Injector.INSTANCE.init(new RootModule());
}

7.) في MainActivity ، استدعاء الحاقن في طريقة onCreate() .

@Override
protected void onCreate(Bundle savedInstanceState)
{
    Injector.INSTANCE.inject(this);
    super.onCreate(savedInstanceState);
    ...

8.) استخدم @Inject في MainActivity الخاص بك.

public class MainActivity extends ActionBarActivity
{  
    @Inject
    public ServerCommunicator serverCommunicator;

...

إذا no injectable constructor found خطأ no injectable constructor found ، فتأكد من عدم نسيان التعليقات التوضيحية @Provides .

Question

كيفية استخدام Dagger؟ كيفية تكوين Dagger للعمل في مشروع Android الخاص بي؟

أرغب في استخدام Dagger في مشروع Android ، ولكني أجده مربكًا.

EDIT: Dagger2 أيضًا خارج 2015 15 15 ، وهو أكثر إرباكًا!

[هذا السؤال هو "كعب" الذي أضيف إليه إجابتي حيث أنني تعلمت المزيد عن Dagger1 ، وتعلم المزيد عن Dagger2. هذا السؤال هو أكثر من مجرد دليل وليس "سؤال".




Links