Dagger 2.10의 Android를 확장해 보십시오.

14637 단어 Dagger2Android
이 글은 Dagger 2.10RC4를 사용했다.

간략한 개요

  • Dagger 2.10에 안드로이드용 확장 모듈 공개
  • 확장 모듈을 사용하여 구성 요소 처리 단순화
  • BaseActivityBaseFragment를 쓰지 않아도 된다
  • 간단하지만 준비 시간이 많이 늘어날 거예요
  • 제가 동작을 시도했기 때문에 최선의 실천인지 몰랐어요
  • 개시하다


    Dagger는 스퀘어가 개발한 DI 라이브러리이며, Dagger 2는 구글 포크 버전이다.정식 Dagger는 Deprecated이며 Dagger2로의 마이그레이션 마법사가 Google에서 공개되었습니다.DridKaigi 회의 응용 프로그램에서도 Dagger2를 사용했고 세션에서도 Dagger2와 관련된 내용이 있어 안드로이드 앱 개발 현장에서 자주 사용된다.
    이런 Dagger2, Dagger2.10RC는 안드로이드용 확장 모듈을 공개했다.비록 Dagger2의 GiitHub Pages에는 확장 모듈을 사용하는 안드로이드 사용법이 적혀 있습니다.의것이지만, 나는 여전히 충분하지 않고 이해하기 어렵다고 생각한다.
    이번에는 이 안드로이드용 확장 모듈을 사용해 보고 싶습니다.

    차리다


    build.gradle


    먼저 app/build.gradle에 Dagger 2의 의존 관계를 씁니다.
    ext {
      dagger_version = '2.10-rc4'
    }
    dependencies {
      compile "com.google.dagger:dagger:${dagger_version}"
      compile "com.google.dagger:dagger-android:${dagger_version}"
      compile "com.google.dagger:dagger-android-support:${dagger_version}"
      annotationProcessor "com.google.dagger:dagger-compiler:${dagger_version}"
      annotationProcessor "com.google.dagger:dagger-android-processor:${dagger_version}"
    }
    
  • dagger-android
  • dagger-android-support
  • dagger-android-processor
  • Android용 확장 모듈입니다.Android Support Library의 Fragment를 사용할 때dagger-android-support는 필요합니다(대부분의 경우 필요하다고 생각합니다).

    App.java


    그런 다음 Application 레벨을 상속하는 사용자 정의 Application 레벨을 준비합니다.여기에 앱이라는 이름을 쓴다.사용자 정의 Application 클래스에는 Dagger의 Android 확장 모듈에 준비된 Ha s D i spatchingActivity Injector가 설치되어 있습니다.액티비티에 대한 의존을 주입하는 데 필요한 것이지만, 안드로이드 서포트 리브레리에 대한 Fragment 의존을 주입하려면 Ha s D i s p a t c h i ngSupport Fragment Injector도 함께 실행해야 한다.
    여기에는 Has D i spatching Activity Injector만 구현됩니다.
    public class App extends Application implements HasDispatchingActivityInjector {
        @Inject
        DispatchingAndroidInjector<Activity> mActivityInjector;
    
        @Override
        public void onCreate() {
            super.onCreate();
            DaggerAppComponent.create().inject(this);
        }
    
        @Override
        public DispatchingAndroidInjector<Activity> activityInjector() {
            return mActivityInjector;
        }
    }
    
    App#onCreate 내 호출DaggerAppComponent.create().inject(this);이 진행 중입니다. 이것은 잠시 후 준비된 AppComponent의 설치입니다.Dagger 2를 컴파일할 때 코드를 생성합니다.호출 대상 방법을 통해@Inject 모조된mActivityInjector에 주입DispatchingAndroidInjector<Activity> 실례.

    AppCompnent.java


    AppComponent.자바 준비해.아까 앱.자바에 D ispatching Android Injector를 주입해야 하기 때문에 해결할 수 있도록 실시합니다.
    @Singleton
    @Component(modules = {
        AndroidInjectionModule.class,
        MainActivityModule.class
    })
    public interface AppComponent {
        void inject(App app);
    }
    
    준비AppComponent#inject(App)를 통해 App.자바에 의존을 주입할 수 있습니다.또 Dagger2의 안드로이드를 확장 모듈에 준비된 안드로이드 Injection Module로 @Component 가이드modules에 전달한다.또 잠시 후 준비된 MainActivity Module도 전달해 드리겠습니다.

    MainActivityModule.java


    MainActivityModule.자바 준비해.이 모듈은 Dagger2의 Android Injector가MainActivity에 의존성을 주입할 수 있도록 합니다.
    @Module(subcomponents = {MainActivityComponent.class})
    public abstract class MainActivityModule {
        @Binds
        @IntoMap
        @ActivityKey(MainActivity.class)
        abstract AndroidInjector.Factory<? extends Activity>
        bindMainActivityInjectorFactory(MainActivityComponent.Builder builder);
    }
    
    이 일대에서 나는 아직 역할과 행위를 이해할 수 없다.등장인물은 더 늘어난다.MainActivity Component 준비

    MainActivityComponent.java


    MainActivityComponent.자바 준비해.이 구성 요소는 MainActivity에 대한 의존도를 보여 줍니다.
    @Subcomponent(modules = ActivityModule.class)
    public interface MainActivityComponent extends AndroidInjector<MainActivity> {
        @Subcomponent.Builder
        abstract class Builder extends AndroidInjector.Builder<MainActivity> {
            public abstract void activityModule(ActivityModule activityModule);
    
            @Override
            public void seedInstance(MainActivity instance) {
                activityModule(new ActivityModule(instance));
            }
        }
    }
    
    Android Injector 인터페이스를 상속합니다.유형 매개 변수는 종속 주입 대상MainActivity에 의해 전달됩니다.어떤 의존관계@Subcomponent가 모조품modules에 쓰여 있습니까?여기서 Activity Module을 건네주세요.
    또한MainActivity Component에서 이 구성 요소의 구축 클래스는 abstract로 정의됩니다.@Subcomponent.Builder 구축 클래스에 초대장을 추가합니다.또한 Android Injector도 있습니다.또한 Builder 클래스를 상속하여 형 매개변수에 MainActivity를 전달합니다.
    액티비티 모듈을 매개 변수activityModule로 하는 추상적인 방법을 준비했다. ActivityInjector.Builder#seedInstance 내에서액티비티 모듈을 액티비티에 넘기기 위한 실례다.seedInstance 방법의 실현과 activityModule에 필요한 요소의 교부 실례를 정의한다.

    ActivityModule.java


    ActivityModule.자바 준비해.이 모듈은 MainActivity를 주입하려는 의존 실체를 기록합니다.
    @Module
    public class ActivityModule {
        private final AppCompatActivity mActivity;
    
        public ActivityModule(AppCompatActivity activity) {
            mActivity = activity;
        }
    
        @Provides
        public LayoutInflater provideLayoutInflater() {
            return LayoutInflater.from(mActivity);
        }
    }
    
    LayoutInflater를 주입해 보세요.공장 방법LayoutInflater#from으로는 컨텍스트를 제출해야 하지만 응용 프로그램을 해결하는 Theme에는Activity 컨텍스트가 필요하다.따라서 Activity의 실례가 필요하지만, 이것은MainActivityComponent입니다.자바에서 전달하는 것으로 정의되었습니다.

    MainActivity.java


    드디어 의존의 주입 목적지인 MainActivity에 도달했다.
    public class MainActivity extends AppCompatActivity {
        @Inject
        LayoutInflater mLayoutInflater;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            AndroidInjection.inject(this);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            if (mLayoutInflater != null) {
                new AlertDialog.Builder(this)
                    .setMessage("Hello, world")
                    .setPositiveButton(android.R.string.ok, null)
                    .show();
            }
        }
    }
    
    여기 새 것은 AndroidInjection.inject(this);입니다.따라서 실례는 @Inject에 초청된 실례LayoutInflater mLayoutInflater;에 주입되었다.코드에 null이 아닌 경우 LayoutInflater가 주입된 경우 경고 대화 상자가 표시되고 종속성이 해결된 경우 경고 대화 상자가 표시됩니다.

    다시 App입니다.java


    모든 준비가 다 되었으면 구축해 보겠습니다.App.자바에서 Dagger2가 생성한 Dagger App Component를 해결해야 하기 때문에 구축에 성공하면 App이 됩니다.자바를 열면 가져오는 것을 촉진합니다.

    가져오기가 완료되었습니다.

    최후


    Dagger 2.10의 Android용 확장 모듈을 시도했습니다.솔직히 이해가 안 되는 부분이 많아서 이런 형식이 정말 좋은지 말할 자신이 없어요.그리고 의존 주입 목적지가 1개씩 늘어날 때마다 대응하는 모듈/Component를 준비해야 하는데, 앱Component@Component의 초대장에 모듈을 열거해야 한다고 생각하면 귀찮아진다.그러나 우리는 모든 주입 목표에 따라 의존 관계를 정의할 수 있고 규정된 규칙에 따라 관리할 수 있는 장점도 있기 때문에 필요에 따라 확장 모듈을 사용하고 싶습니다.

    좋은 웹페이지 즐겨찾기