繁体   English   中英

如何在android库项目中使用dagger

[英]How to use dagger in a android library project

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

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

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

非常感谢你的帮助。

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

如果有人使用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);
}

然后我在下面创建了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();
    }
}

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

我是这样做的:

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

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

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

     interface Injector { void inject(Object object); public ObjectGraph getObjectGraph(); } 

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

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

class LibraryActivity extends Activity {

    @Inject ActivationModule instance;

    void onCreate(... ) {
        Injector injector = (Injector)getApplicationContext();
        injector.inject(this)
    }
}

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 {
    ....
}

如果您将这个图书馆提供给人们并且他们对您的场景一无所知,那么您必须以您的Dagger完美工作的方式编写它,而无需用户的任何帮助。 (使用更好的练习更容易)

我刚刚为你写了一些图书馆来展示如何做到这一点。 我以一种你甚至可以独立运行它的方式编写库,并在消息选项卡中查看结果。 你的图书馆的用户不需要对匕首一无所知,也不做任何他只是使用图书馆和匕首的配置:

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

如果这个库是您自己使用的,对于您自己的项目,最好的做法就是在我的朋友的这个项目中这样做:

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

您在这两个项目中回答了所有问题。 在评论中提出任何疑问和错误答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM