3

我从未尝试过 Guide 或其他 DI 库,而是尝试将来自 Square 的 Dagger 用于 Android 应用程序。它适用于 Frgements,但不适用于 POJO。用户指南假定对 DI 有一定的了解,因为它没有更详细地解释。我应该怎么做才能注入restAdapater我的 POJO。如果我使用相同的代码进行字段注入,它可以在 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 不会知道这个实例并且不能为你注入依赖。

由于您已经在 Module entryPoints 中声明了 Auth.class,您只需向 ObjectGraph 询问 Auth 实例:

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

然后,Dagger 会知道提供 Auth 实例需要什么,即将它与您的 RestAdapter 一起注入。

于 2013-01-30T12:35:17.457 回答