如何在android库项目中使用dagger

seb*_*ian 50 java android dagger

我正在尝试将Dagger添加到我的android项目中.对于应用程序项目,我很容易清楚,如何构建ObjectGraph.但我不知道在我的android库项目中最好的方法是什么.

我应该继续在应用程序的Application类中构建ObjectGraph并将OG传递给LibraryModule - 将库的OG插入到Apps OG中吗?或者我应该在库中构建整个ObjectGraph?

如果我需要在库中注入一个类ObjectGraph.inject(this)怎么办?在我的Apps项目中,我可以从Application类中获取OG.但是如何在图书馆处理这个?我应该为ObjectGraph添加@Provides方法吗?

非常感谢你的帮助.

编辑:简而言之:如何ObjectGraph.inject(this)在我的库项目中调用我无法访问OG的项目,因为它正在Application类中构建?

Edg*_*des 31

如果有人使用Dagger 2来到这里,这就是我在我的应用程序中所做的方式:

在库模块中,我创建了以下模块和组件:

@Module
public class ModuleUtil {

    @Provides
    public RestTemplate provideRestTemplate() {
        return new RestTemplate();
    }

}

@Singleton
@Component(
        modules = {
                ModuleUtil.class
        })
public interface MainComponent {
    void inject(Postman postman);
}
Run Code Online (Sandbox Code Playgroud)

然后我在下面创建了Singleton以管理注射:

public class DaggerWrapper {

    private static MainComponent mComponent;

    public static MainComponent getComponent() {
        if (mComponent == null) {
            initComponent();
        }
        return mComponent;
    }

    private static void initComponent () {
       mComponent = DaggerMainComponent
                .builder()
                .utilModule(new ModuleUtil())
                .build();
    }
}
Run Code Online (Sandbox Code Playgroud)

当库模块中的某个类需要注入其成员时,我只是调用 DaggerWrapper.getComponent().inject(this);它而不是它.


小智 12

我是这样做的:

  1. @Module类属于主项目,它们提供了向库元素注入的实现,因此库项目中没有@Module类

  2. 期望依赖的库元素必须能够访问ObjectGraph并自己调用.inject(),但主项目应该使用提供的@Module依赖项将ObjectGraph实例赋予库

  3. 如何将ObjectGraph从主项目导入库中?你可以有这样的界面:

    interface Injector {
        void inject(Object object);
        public ObjectGraph getObjectGraph(); 
    }
    Run Code Online (Sandbox Code Playgroud)

像Activity或Application类这样的Context对象实现了这个接口(ObjectGraph对象的持有者).

如果你在库模块中有Activity的例子,它需要从主项目中注入一些东西,它将如下所示:

class LibraryActivity extends Activity {

    @Inject ActivationModule instance;

    void onCreate(... ) {
        Injector injector = (Injector)getApplicationContext();
        injector.inject(this)
    }
}
Run Code Online (Sandbox Code Playgroud)

ActivationModule是库项目中的类/接口.

主项目具有应用程序类,该类实现Injector接口并创建ObjectGraph,并为库项目中的ActivationModule提供依赖性.

class MyApplicationInTheMainProject extends Application implements Injector {

    ObjectGraph graph;

    @Override
    public void onCreate() {
        super.onCreate();
        graph = ObjectGraph.create(new ActivationModuleImpl(this));
    }

    @Override public void inject(Object object) {
        graph.inject(object);
    }

    @Override public ObjectGraph getObjectGraph() {
        return graph;
    }
}


@Module(injects = {
        LibraryActivity.class
}, library = true)
class ActivationModuleImpl implements ActivationModule {
    ....
}
Run Code Online (Sandbox Code Playgroud)


Ami*_*ati 5

如果您将这个库提供给人们,而他们对您的情况一无所知,那么您必须以一种使Dagger完美运行的方式编写它,而无需用户的任何帮助。(越容易进行更好的实践)

我刚刚为您编写了一些库以演示如何做。我以一种甚至可以独立运行它并在“消息”选项卡中查看结果的方式编写了该库。您库的用户不需要了解有关dagger的信息,也不需要使用他仅使用的库,并且将配置dagger:

https://github.com/amirziaratii/libraryUsingDagger.git

如果该库是您自己使用的,并且用于您自己的项目,则最佳做法是像在我朋友的这个项目中一样:

https://github.com/mmirhoseini/trakt.tv

这两个项目都回答了您所有的问题。在评论中提出任何问题和不正确的答案。