2017-07-29 17 views
2

私はDaggerとDIを使用する初心者です。依存関係をそのアクティビティの断片に挿入するためにAndroidInjectionリゾルバを使用しようとしています。Android Daggerと任意の瞬間にモジュールを設定する

一般的に、私はDagger.androidを使用した場合には、私はMyAppComponentを作成し、AndroidInjection.inject(Activity/Fragment/etc..)を使用するためにAndroidInjectionModuleをインストールする必要があり、ことを理解しました。このようにして、Daggerが適切なインジェクタを生成できるようにするため、SubcomponentsのインタフェースをBuildersに提供しました。

しかし、サブコンポーネント、つまりパラメータ化されたコンストラクタを持つモジュールに依存するDeviceFragmentSubcomponentがある場合はどうなりますか?

@Subcomponent(modules = {DeviceModule.class}) 
public interface DevicePageFragmentSubcomponent extends AndroidInjector<DevicePageFragment>{ 

    @Subcomponent.Builder 
    public abstract class Builder extends AndroidInjector.Builder<DevicePageFragment>{ 
     public abstract Builder setDeviceModule(DeviceModule deviceModule); 
    } 
} 

@Module 
public class DeviceModule { 

    private Device mDevice; 

    public DeviceModule(Device device) { 
     mDevice = device; 
    } 

    @Provides 
    public Device provideDevice(){ 
     return mDevice; 
    } 
} 

その断片でAndroidInjection.inject(this)を使用するためのDeviceActivity内DeviceModuleインスタンスを設定するために何をすべきか?

作成アプリケーションの依存関係ツリーではなく、任意のイベントで、必要なモジュールを追加できますか?

答えて

0

DaggerのAndroidインジェクション部分は、(現在)AndroidInjection.inject(this)と一緒に使用することができます.では、あらかじめ定義されたモジュールで特定のAndroidフレームワークタイプを注入します。

このように、パラメータまたはモジュールを渡す方法はありません。

あなたの最初のオプションは、DaggerのAndroid注入部分を使用しないことです。あなたの体にフィットするようにコンポーネントを作成し、オブジェクトを注入してください。

第2のオプションは、パラメータ/モジュールを使用しないことです。理論上、あなたのアクティビティがDeviceModuleを作成できる場合、Daggerはアクティビティ—にアクセスでき、Androidインジェクションパーツを使用することで、あなたのタイプをインジェクトするコンポーネントがアクセスできます。

あなたはDeviceの依存関係を指定していないか、またはあなたのフラグメントからDeviceModuleにそれを渡す必要があるのはなぜですか?

DeviceDevicePageFragmentに依存しているとします。

class Device { 
    @Inject Device(DevicePageFragment fragment) { /**/ } // inject the fragment directly 
} 

フラグメントにアクセスして行うことができます。それがあなたの場合ではない場合は、引数Bundleを読む必要があるとしましょう。あなたは、デバイスを取らないようにあなたのモジュールを変更することができますが、むしろiselfを作成し、同様にコンストラクタの引数を取り除く。

@Module 
public class DeviceModule { 

    // no constructor, we create the object below 

    // again we take the fragment as dependency, so we have full access 
    @Provides 
    public Device provideDevice(DevicePageFragment fragment){ 
    // read your configuration from the fragment, w/e 
    long id = fragment.getArguments().getLong("id") 
    // create the device in the module 
    return new Device(id); 
    } 
} 

最終的には本当にあなたの用途に依存します。


私が表示しようとしたのは、あなたが注入しようとしているオブジェクトにアクセスできるということでした。つまり、このオブジェクト内でできることは何でも、Dagger内で行うことができます。上記のように、ターゲットからこれらのパラメータを抽出できるので、パラメータ化されたモジュールは必要ありません。

+0

dagger.android能力の説明に感謝します。私はこのように行こうとはしません。実際には、私はモジュールでオブジェクトを非カプセル化し、このオブジェクトをActivityとFragmentsの間で共有しました。今、私のニーズを満たしています。そして、はい、Daggerを使用するオプションがたくさんあります。依存ツリーが作成された後、徐々にモジュールを追加することに興味がありました。それは答えと思われます) – atlascoder

関連する問題