Java 如何在android库项目中使用dagger

Java 如何在android库项目中使用dagger,java,android,dagger,Java,Android,Dagger,我目前正试图将Dagger添加到我的android项目中。对于应用程序项目,如何构建ObjectGraph对我来说既简单又清晰。但我不知道在我的android库项目中,什么是最好的方法 我是否应该继续在应用程序的应用程序类中构建ObjectGraph,并将OG传递给LibraryModule—将library的OG加上应用程序的OG?还是应该在库中构建整个ObjectGraph 如果我需要通过ObjectGraph.inject(this)在库中注入一个类,该怎么办?在我的应用程序项目中,我可以

我目前正试图将Dagger添加到我的android项目中。对于应用程序项目,如何构建ObjectGraph对我来说既简单又清晰。但我不知道在我的android库项目中,什么是最好的方法

我是否应该继续在应用程序的应用程序类中构建ObjectGraph,并将OG传递给LibraryModule—将library的OG加上应用程序的OG?还是应该在库中构建整个ObjectGraph

如果我需要通过
ObjectGraph.inject(this)
在库中注入一个类,该怎么办?在我的应用程序项目中,我可以从应用程序类获取OG。但是在图书馆里怎么处理呢?我应该为ObjectGraph添加@Providers方法吗

非常感谢你的帮助

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

我是这样做的:

  • @模块类属于主项目,它们提供了要注入到库元素的实现,因此库项目中没有@Module类

  • 需要依赖关系的库元素本身必须具有对ObjectGraph和call.inject()的访问权限,但主项目应将ObjectGraph实例提供给具有@Module依赖关系的库

  • 如何将ObjectGraph从主项目获取到库中?您可以使用如下界面:

    interface Injector {
        void inject(Object object);
        public ObjectGraph getObjectGraph(); 
    }
    class LibraryActivity extends Activity {
    
        @Inject ActivationModule instance;
    
        void onCreate(... ) {
            Injector injector = (Injector)getApplicationContext();
            injector.inject(this)
        }
    }
    
  • 像Activity或Application class这样的上下文对象实现了这个接口(ObjectGraph对象的持有者)

    如果在库模块中有需要从主项目中注入某些内容的活动示例,则如下所示:

    interface Injector {
        void inject(Object object);
        public ObjectGraph getObjectGraph(); 
    }
    class LibraryActivity extends Activity {
    
        @Inject ActivationModule instance;
    
        void onCreate(... ) {
            Injector injector = (Injector)getApplicationContext();
            injector.inject(this)
        }
    }
    
    ActivationModule是库项目中的类/接口

    主项目具有应用程序类,该类实现Injector接口,并创建ObjectGraph,该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 {
        ....
    }
    

    如果有人使用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);
    }
    
    为了管理注入,我创建了下面的单例:

    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();
        }
    }
    

    当库模块中的某个类需要注入其成员时,我只需调用
    daggerRapper.getComponent().inject(this)仅此而已。

    如果您将此库提供给其他人,而他们对您的场景一无所知,那么您必须以一种方式编写它,即您的匕首可以完美地工作,而无需用户的任何帮助。(越容易操作,实践越好)

    我只是写了一些库给你看如何做。我编写这个库时,您甚至可以独立运行它,并在messages选项卡中查看结果。您库的用户不需要对dagger一无所知,也不需要做任何事情,他只需使用库,dagger将被配置为:

    如果此库是您自己使用的,并且用于您自己的项目,那么最好的做法是在my friend的项目中这样做:


    这两个项目回答了您所有的问题。问任何问题,我都会在评论中回答。

    我也有这个问题。。。有人知道怎么做吗?@sebastian你解决了你的问题吗?如果是,那么发布你的解决方案。我被困在Dagger 2中。你的库不应该从属于其父对象的对象图中被注入。它不再是图书馆了。库不依赖于它的父库。您可以考虑创建某种类型的基础/核心模块,其中包含您的库可以依赖的对象图。有人能帮我吗?我知道DaggerRapper也在你的库模块中,可以从你的应用模块访问它。这是正确的吗?这似乎是一个更好的答案,因为它不需要应用程序(库的客户机)的任何东西。它可以工作吗?遵循相同的过程,但不起作用。我在构建应用程序时遇到“找不到符号类DaggerComponent”错误。您是否尝试过使用dagger android库来简化设置:如果有人遇到DaggerComponent错误,请确保在build.gradle-apply plugin中添加以下两个依赖项:“kotlin android”apply plugin:“kotlin kapt”。但这个解决方案对我有效。