如何在安卓库项目中使用匕首

2022-08-31 17:40:15

我目前正在尝试将Dagger添加到我的Android项目中。对于应用程序项目来说,对我来说很容易和清晰,如何构建ObjectGraph。但我不太清楚在我的Android库项目中做到这一点的最佳方法是什么。

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

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

非常感谢您的帮助。

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


答案 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);
}

然后我在下面创建了单例,以便管理注射:

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


答案 2

我正在这样做:

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

  2. 期望依赖关系的库元素必须有权访问 ObjectGraph 并在自身上调用 .inject(),但主项目应将 ObjectGraph 实例提供给具有@Module依赖关系的库

  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 是库项目中的类/接口。

主项目具有应用程序类,它实现注入器接口并创建对象图,并在库项目中为激活模块提供了依赖性。

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

推荐