gpt4 book ai didi

java - 如何从另一个模块注入(inject)实现

转载 作者:行者123 更新时间:2023-11-30 03:04:04 25 4
gpt4 key购买 nike

我有一个基于 Dagger 2 的项目,它由两个模块组成。核心模块包括一些接口(interface)和一些为这些接口(interface)声明成员注入(inject)的类。

这些接口(interface)的实际实现包含在第二个模块中,该模块是一个 Android 项目。因此,这些的提供方法自然包含在 Android 项目中。

Dagger 在编译过程中会提示不知道如何将它们注入(inject)核心模块。

关于如何在不使用构造函数注入(inject)的情况下实现此目的有什么想法吗?

最佳答案

总之,我刚刚尝试过这个,并且有效。请务必检查确切的错误消息,并确保您提供这些接口(interface)并且存在 @Inject 注释。

可能只是一些错误的命名接口(interface)或缺少注释。接下来是使用您所描述的架构的完整示例,该架构编译得很好。您当前遇到的问题可能是本文最后一部分中描述的问题。如果可能的话,您应该使用第一个解决方案并仅添加这些注释。

图书馆

为了实现可重复性,该示例具有极简模型。首先是我的类在库模块中需要的接口(interface):

public interface MyInterface {
}

这是我需要该接口(interface)的类。确保在构造函数中声明它并提供 @Inject 注解!

@MyScope // be sure to add scopes in your class if you use constructor injection!
public class MyClassUsingMyInterface {
private MyInterface mMyInterface;

@Inject
public MyClassUsingMyInterface(MyInterface myInterface) {
mMyInterface = myInterface;
}
}

这个想法是,该接口(interface)将由应用程序使用 MyClassUsingMyInterface 实现并由 dagger 提供。代码很好地解耦了,我的很棒的库(功能不多)已经完成。

应用程序

这里需要提供实际的联轴器。这意味着要获取 MyClassUsingMyInterface,我们必须确保可以提供 MyInterface。让我们从提供该功能的模块开始:

@Module
public class MyModule {

@Provides
MyInterface providesMyInterface() {
return new MyInterface() {
// my super awesome implementation. MIT license applies.
};
}
}

为了实际使用它,我们提供了一个可以注入(inject)到需要 MyClassUsingMyInterfaceMyTestInjectedClass 的组件。

@Component(modules = MyModule.class)
public interface MyComponent {

void inject(MyTestInjectedClass testClass);
}

现在我们有办法提供所请求的接口(interface)。我们在用 @Inject 标记的构造函数中声明了库类所需的接口(interface)。现在我想要一个需要我很棒的库类才能使用的类。我想用 Dagger 注入(inject)它。

public class MyTestInjectedClass {

@Inject
MyClassUsingMyInterface mMyClassUsingMyInterface;

void onStart() {
DaggerMyComponent.create().inject(this);
}
}

现在我们点击编译...并且 dagger 将创建所需的所有工厂。

注入(inject)您无法修改的库

为了提供 dagger 的完整功能,该示例也可能无法实际访问该库的源代码。如果没有@Inject注解dagger将很难创建对象。注意缺少的注释:

public class MyClassUsingMyInterface {
private MyInterface mMyInterface;

public MyClassUsingMyInterface(MyInterface myInterface) {
mMyInterface = myInterface;
}
}

在这种情况下,我们必须手动提供该类。该模块需要进行如下修改:

@Module
public class MyModule {

@Provides
MyInterface providesMyInterface() {
return new MyInterface() {
};
}

@Provides
MyClassUsingMyInterface providesMyClass(MyInterface myInterface) {
return new MyClassUsingMyInterface(myInterface);
}
}

这引入了更多的代码供我们编写,但将使这些类可用但您无法修改。

关于java - 如何从另一个模块注入(inject)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35240222/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com