2016-10-06 10 views
1

私は複数のアクティビティを持ち、すべてのアクティビティに別々のDagger2コンポーネントが含まれているとします。従ってFooActivityFooComponentとなり、BarActivityBarComponentとなります。また、私はいくつかのビューグループを持って、BazViewGroupを両方のアクティビティで使用でき、ダガーグラフを介していくつかの依存関係を受け取らなければならないとしましょう。このビューグループのインスタンスに依存関係を注入する最も良い方法は、そのアクティビティがどのアクティビティに属しているかを事前に把握していないからです。異なるDagger2コンポーネントから同じクラスに注入する方法は?

  1. すべての活動は、この活動
  2. すべてのコンポーネントに含まれる成分を返すメソッドgetComponent()公開するインターフェイスのような

    public interface CanInjectIntoBazViewGroup { 
        void inject(BazViewGroup viewgroup); 
    } 
    
  3. インサイドBazViewGroupのconstuctorを拡張:

    は今、私は次のセットアップを持っています私はアクティビティへの参照を取得し、コンポーネントを取得してCanInjectIntoBazViewGroupにキャストし、injectメソッドを呼び出します。

これを行うより良い方法はありますか?

答えて

0

ダガー2のベストプラクティスは、他のものと同様に乱用しないことです。

すでにあなたのActivitiesためのコンポーネントを持っている、とあなたは両方ActivitiesBazViewGroupへの参照を持っているのであれば、その後、私はこのBazViewGroupにDIを実行するために、ダガー2を使用する理由は表示されません。

2つのケースがあります。

のViewGroupをXMLで宣言されている:

あなたがXMLでBazViewGroupを宣言し、Androidがあなたのためにそれを膨らませている場合、あなたは「メソッドのDI」を実行することができます - このオブジェクトのsetXYZ()のようなメソッドを定義して、XYZを渡しますビュー階層が拡張された後にActivitiesから

あなたは、プログラムのViewGroupを作成:

あなたがプログラムでViewGroupをインスタンス化している場合は、コンストラクタのパラメータとしてその依存関係を追加することができます。

と内部がViewGroupの間にいくつかの結合が作成されるため、どちらのアプローチもきれいではありませんが、ViewGroupをDaggerフレームワークに結合するよりはるかに優れています。

より明確な方法は、これらの依存関係をViewGroupから削除することです。私はユーザーのやりとりやデータ照会のためにいくつかのアクションを実行するためにそれらが必要だと思いますか?コールバックインターフェイスを作成せず、これらのすべてのアクションを同封するActivityに委任するのはなぜですか?このようにして、ある日ビジネスロジックをリファクタリングすると、カスタムViewsは影響を受けません。

関連する問題