- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基于 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)到需要 MyClassUsingMyInterface
的 MyTestInjectedClass
的组件。
@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 将创建所需的所有工厂。
为了提供 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/
我是一名优秀的程序员,十分优秀!