我有一个基于Dagger 2的项目,该项目包含两个模块。核心模块包括一些接口和一些类,这些类具有为这些接口声明的成员注入。
这些接口的实际实现包含在第二个模块中,该模块是一个Android项目。因此,这些项目的提供方法自然会包含在Android项目中。
Dagger在编译过程中会抱怨不知道如何将它们注入到核心模块中。
关于如何在不使用构造函数注入的情况下实现此目标的任何想法?
简而言之,我只是尝试了一下,并且它起作用了。确保检查确切的错误消息,并确保提供了这些接口和@Inject
注释。
可能只是某些错误的命名接口或缺少的注释。后续操作是使用您描述的体系结构的完整示例,并且可以很好地进行编译。您当前遇到的问题可能是本文最后一部分中描述的问题。如果可能的话,您应该采用第一个解决方案,并只添加那些注释。
为了重现性,该样本具有极简模型。首先,我的类在库模块中所需的接口:
public interface MyInterface {
}
这是我需要该接口的课程。确保在构造函数中声明它并提供@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;
}
}
这个想法是,该接口将由应用使用MyClassUsingMyInterface
dagger并由dagger提供。代码已经很好地解耦了,并且我的功能强大的库没有那么多功能。
这里需要提供实际的联轴器。这意味着要获得MyClassUsingMyInterface
我们必须确保我们能够提供MyInterface
。让我们从提供以下内容的模块开始:
@Module
public class MyModule {
@Provides
MyInterface providesMyInterface() {
return new MyInterface() {
// my super awesome implementation. MIT license applies.
};
}
}
为了实际使用它,我们提供了一个可以注入到MyTestInjectedClass
需要的组件中MyClassUsingMyInterface
。
@Component(modules = MyModule.class)
public interface MyComponent {
void inject(MyTestInjectedClass testClass);
}
现在,我们可以提供所需的接口。我们在标记为的构造函数中声明了库类所需的接口@Inject
。现在,我需要一个需要很棒的库类使用的类。我想用匕首注入它。
public class MyTestInjectedClass {
@Inject
MyClassUsingMyInterface mMyClassUsingMyInterface;
void onStart() {
DaggerMyComponent.create().inject(this);
}
}
现在我们进行编译...匕首将创建所有需要的工厂。
为了仅提供完整的匕首,该示例也可能没有实际访问库的源代码。如果没有@Inject
注释,匕首将很难创建对象。注意缺少的注释:
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);
}
}
这引入了更多代码供我们编写,但是将使您无法修改的那些类可用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句