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

标签 java dependency-injection dagger-2

我有一个基于 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/

相关文章:

java - 如何使用 Dagger2 实现工厂

android - Dagger 2 如何使用子组件将一个类注入(inject)多个组件?

java - typeinfo 的多态 Jackson 反序列化不适用于枚举

java - 无法从 jar 文件启动 JavaFx 应用程序。未找到类异常

java - 如何使用 JOptionPane 为整数赋值?

java - 将 AppContext 实现为 Play 插件

java - Spring 两种不同的应用上下文——属性占位符冲突

android - Dagger 2 Android 应用程序组件缺少注入(inject)方法

java - 用于 Eclipse 的 JBPM 3 插件和用于 Eclipse 的 JPBM 4 插件中的弯曲点有什么区别?

java - 如何从PHP返回数据到java?