【问题标题】:How to use dagger in a android library project如何在 android 库项目中使用 dagger
【发布时间】:2014-11-09 21:11:49
【问题描述】:

我目前正在尝试将 Dagger 添加到我的 android 项目中。对于应用程序项目,我很容易明白如何构建 ObjectGraph。但我不太清楚在我的 android 库项目中执行此操作的最佳方法是什么。

我是否应该继续在应用程序的 Application 类中构建 ObjectGraph 并将 OG 传递给 LibraryModule - 将库的 OG 加到 Apps OG 中?还是应该在库中构建整个 ObjectGraph?

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

非常感谢您的帮助。

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

【问题讨论】:

  • 我也有这个问题...有人真的知道怎么做吗?
  • @sebastian 你的问题解决了吗?如果是,请发布您的解决方案..
  • 我在 Dagger 2 中被困住了
  • 您的库不应从属于其父级的对象图注入。它不再是图书馆了。库不依赖于它的父级。您可以考虑创建某种基础/核心模块,其中包含您的库可以依赖的对象图。
  • 坚持了好几个小时。谁能帮我解决这个问题?

标签: java android dagger


【解决方案1】:

万一有人使用 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); 即可。

【讨论】:

  • 我知道 DaggerWrapper 也在您的库模块中,并且可以从您的应用程序模块中访问。这是正确的吗?
  • 这似乎是一个更好的答案,因为它不需要任何应用程序(库的客户端)。
  • 有人用吗?遵循相同的过程但无法正常工作。我在构建应用程序时收到“找不到符号类 DaggerMainComponent”错误。
  • 您是否尝试过使用 dagger-android lib 进行更简单的设置:google.github.io/dagger/android.html
  • 如果有人遇到 DaggerMainComponent 错误,请确保在 build.gradle 中添加以下两个依赖项 - 应用插件:'kotlin-android' 应用插件:'kotlin-kapt'。但这个解决方案对我有用。
【解决方案2】:

我正在这样做:

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

  2. 需要依赖的库元素必须有权访问 ObjectGraph 并对其自身调用 .inject(),但主项目应通过提供的 @Module 依赖将 ObjectGraph 实例提供给库

  3. 如何从主项目中获取 ObjectGraph 到库中?你可以有这样的界面:

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

诸如 Activity 或 Application 类的上下文对象实现了这个接口(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 {
    ....
}

【讨论】:

    【解决方案3】:

    如果你将这个库提供给人们并且他们对你的场景一无所知,那么你必须以一种你的 Dagger 可以在没有用户帮助的情况下完美运行的方式编写它。 (越容易使用越好)

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

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

    如果这个库是你自己和你自己的项目使用的,最好的做法是像我朋友的这个项目一样:

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

    您的所有问题都在这两个项目中得到解答。在评论中提出任何问题和不好的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 2013-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多