android dagger 2注入mvpアーキテクチャ

6480 ワード

dagger 2単純な応用は1つのmvpアーキテクチャで例aptコンパイルを行う時コードapt自動生成コードを生成してdagger 2に注入を提供する
このブログではdagger 2を用いて簡単なmvpアーキテクチャを構築する文章をいくつかの部分に分けています.
  • まずmvpのアーキテクチャ
  • について述べる.
  • そしてdaggerの使用
  • 最後にdagger 2を用いて注入構築mvpアーキテクチャ
  • を完了する.
    ポイントはdagger 2なので.ネットワーク部分はカプセル化されず、rxjava+retrofitが一般的です.これは自分の実情と結びつけて、バックグラウンドではなく、パッケージも違います.
    第一部mvpアーキテクチャ
    mvpはみんなよく知っていると思います.私はくだらないことを言いません.ここでは簡略化されたviewとpresenterを採用し,プロジェクトはm層を用いられない.Activityとfragmentはuiを担当し、presenterはデータのロードを担当し、ネットワーク要求を担当し、ロードが完了したらインタフェースを通じてactivityとfragmentに戻ります.これは簡単なmvpアーキテクチャです.activity圧力を軽減
    第2部dagger 2の使用について簡単に説明する
    dagger 2の原理と詳細はすでに多くの文章がよく書かれています.私は簡単に使い方を言えばいいです.まずこんなものがいくつかあります.Component Moduleとscopeです.この3つのものは完全な注入です.アプリケーションレベルのComponentはアプリケーションで初期化する必要があり、activityレベルの必要はactivityで初期化する必要があります.fragmentはactivityと同じです.
    まずパッケージを導入
        compile 'com.google.dagger:dagger:2.7'
        provided   'com.google.dagger:dagger-compiler:2.6.1'
    

    Scope Module Component
  • 一番簡単なscope
  • scopeは役割範囲、役割ドメインを表示するために使用され、providerメソッドに書くと、この注釈アプリケーションは一般的にグローバル単例モードなので、Socopeはdagger 2が持参したSingletonで他のSocopeが自分で定義すればいいのです.例えばactivityの
    @Scope
    public @interface ActivityScope {
    }
    

    こんなに簡単です.
  • scope作成Module
  • modeuleの役割は、あなたのインスタンスを作成することです.依存注入にもインスタンスを作成する場所があるでしょう.moduleです.Moduleは実は単純なファクトリモードで、Moduleの中の方法は基本的にクラスインスタンスを作成する方法です.ただし、自分のクラスは三者ではありません.作成する必要はありません.インスタンス化が必要なオブジェクトの構造方法をinjectで表記するだけです.moduleの中の1つの方法をProvidesで表記します.この方法の戻り値はinjectで表記された構造方法のパラメータです.dagger 2はこのinjectで表記された構造方法を自分で初期化して例を見ます.
    @Module
    public class TestModule {
     
    
        public TestModule(Activity a) {
        
        }
    
        @Provides
        @ActivityScope//    soupe
        public String provideBindMobActivity() {
            return new String("xx"); 
        
        }
    
    public class Student {
        private String name;
    
        @Inject
        public Student(String name) {
            this.name = name;
        }
    }
    

    最後に使用
    @inject
    Student xiaoming;
    

    xiaomingのstudentの例があります.
    まとめると、新しいmoduleを作成するには、クラス注釈moduleを追加する必要があります.これにより、dagger 2はmoduleであることを知っています.studentの構造はstringを受け入れ、moduleのproviderメソッドはちょうどstringを返します.これにより、newを書く必要がなくstudentをインスタンス化することができます.
  • 最後にComponentが好奇心を持っているかどうか、moduleがどのようにinjectと関連しているのか.コンポーネントというミドルウェアによって接続が確立されています.例
  • @ActivityScope
    @Component(modules = TestModule.class)
    public interface Testcomponent {
        void inject(Activity a)
    }
    

    ルールは、まずscopeの役割ドメインであり、これはあなたのmodule上のproviderメソッドのscopeに対応しています.それからこのようなインタフェースで、Componentを使ってmoduleとinjectを関連付けました.そうですね.インタフェースにはactivity注入を行うinectメソッドがあります
    dagger 2はそうです.簡単に理解してください.次はdagger 2とmvpの結合で、後でコードが与えられます.
    dagger 2とmvpの結合
    上のmvpアーキテクチャは,new newがdagger 2依存注入厚を採用する必要があり,newでは必要ない.まずdagger 2のappレベルの初期化です.それとも3つの部分に分けてModule
    @Module
    public class AppModule {
        private Application application;
        public AppModule(Application application) {
            this.application = application;
        }
       
    }
    

    Component
    @Singleton
    @Component(modules = AppModule.class)
    public interface Appcomponent {
    
    }
    
    

    および注入初期化コード.アプリレベルはもちろんアプリケーションで初期化します
    public class MyApplication extends Application {
        private static MyApplication mInst;
        private Appcomponent mAppcomponent;
        @Override
        public void onCreate() {
            super.onCreate();
            mInst = this;
            mAppcomponent = DaggerAppcomponent.     //Dagger +     component  
                    builder()
                    .appModule(new AppModule(this))  //      App  Module   
                    .build();
        }
        public static MyApplication getInst() {
            return mInst;
        }
    
        public Appcomponent getAppComponent() {
            return mAppcomponent;
        }
    
    }
    
    

    appレベルの初期化が完了すると、activityレベルを続行できます.まだ3つの部分です
    moduleの構造はactivityを受け入れ、providerは直接戻ります.
    @Module
    public class ActivityModule {
        BaseMVPActivity activity;
    
        public ActivityModule(BaseMVPActivity activity) {
            this.activity = activity;
        }
        @Provides
        @ActivityScope
        public BaseMVPActivity provideBindMobActivity() {
            return activity;
       
    

    これのComponent dependenciesはappを1つ持っていて、この点は関係を継承するようで、appの中のを使うことができて、自分のはActivity Moduleです.
    @ActivityScope
    @Component(dependencies = Appcomponent.class,
            modules = ActivityModule.class)
    public interface Activitycomponent {
    
        void inject(MainActivity activity);
    
     //          Component
    //    void inject(SecondActivity activity);
        
    //    void inject(Tread activity);
    }
    

    最後のステップはactivityに注入を初期化しactivityに自然にactivityに書くことです
    抽象的な親に書いてあります
    public abstract class BaseMVPActivity

    extends AppCompatActivity implements BaseMvpViewInterface { @Inject// Presenter inject 。 protected P mvpPresenter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initInject(DaggerActivitycomponent.builder() .appcomponent(MyApplication.getInst().getAppComponent()) .activityModule(new ActivityModule(this)) .build()); mvpPresenter.attachView(this); } protected abstract void initInject(Activitycomponent activityComponent); @Override protected void onDestroy() { super.onDestroy(); if (mvpPresenter != null) { mvpPresenter.detachView(); } } }

    public class MainActivity extends BaseMVPActivity implements MainAcView {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mvpPresenter.loadData();
        }
    
        @Override
        protected void initInject(Activitycomponent activityComponent) {
            activityComponent.inject(this);
        }
    
        @Override
        public void loadSucess(String string) {
            Toast.makeText(this, string, Toast.LENGTH_SHORT).show();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mvpPresenter.detachView();
        }
    }
    
    

    抽象親クラスは抽象メソッドで、サブクラスを注入し、injectで表記されたpreseterはnewに必要ありません.
    こんな感じです.新しいmvpのactivityを作成するたびに、あまり操作する必要はありません.親抽象的な方法を実装し、注入すればいいだけです.
    demoアドレスhttps://github.com/836154942/simpledaggermvp