3

Guideやその他のDIライブラリを試したことはありませんが、AndroidアプリケーションにsquareのDaggerを使用しようとしています。Frgementsには最適ですが、POJOには有効ではありません。ユーザーガイドは、詳細に説明されていないため、DIに関するある程度の知識があることを前提としています。restAdapaterPOJOに注入するにはどうすればよいですか。同じコードでフィールドインジェクションを行うと、Fragmentで機能します。

public class MyApplication extends Application {
    private ObjectGraph objectGraph;

    @Override
    public void onCreate() {
        super.onCreate();
        objectGraph = ObjectGraph.create(new DIModule(this));

    }

    public ObjectGraph objectGraph() {
        return objectGraph;
    }

    public void inject(Object object) {
        objectGraph.inject(object);
    }

    ...
    @Module(entryPoints = { 
    MainActivity.class,  
    .....,
    Auth.class, 
    RestAdapter.class
    })
    static class DIModule {@Provides
        @Singleton
        public RestAdapter provideRestAdapter() {
            return new RestAdapter.Builder().setServer(
                    new Server(Const.BASE_URL)).build();
        }
    }
}

// POJO

public class Auth {

    @Inject
    RestAdapter restAdapater;


    String Username;
    String Password;

    public String authenticate() {
     ...

     Api api = restAdapater.create(..)  // **restAdapater is null**

     }
}

すべてのフラグメントは以下から派生しており、DIはそれらで正常に機能します。Eric burkeによる最近の講演で、Androidがオブジェクトを構築するため、これが必要であると説明しています。

public class BaseFragment extends Fragment {
    @Override
    public void onCreate(Bundle state) {
        super.onCreate(state);

        ((MyApplication) getActivity()
                .getApplication())
                .inject(this);
    }

}
4

1 に答える 1

8

自分で Auth インスタンスを作成した場合、Dagger はこのインスタンスを認識せず、依存関係を注入することができません。

モジュールの entryPoints で既に Auth.class を宣言しているため、ObjectGraph に Auth インスタンスを要求するだけです。

Auth auth = objectGraph.get(Auth.class);

Dagger は、Auth のインスタンスを提供するために何が必要かを認識します。つまり、RestAdapter でそれを注入します。

于 2013-01-30T12:35:17.457 に答える