seb*_*ian 50 java android dagger
我正在尝试将Dagger添加到我的android项目中.对于应用程序项目,我很容易清楚,如何构建ObjectGraph.但我不知道在我的android库项目中最好的方法是什么.
我应该继续在应用程序的Application类中构建ObjectGraph并将OG传递给LibraryModule - 将库的OG插入到Apps OG中吗?或者我应该在库中构建整个ObjectGraph?
如果我需要在库中注入一个类ObjectGraph.inject(this)怎么办?在我的Apps项目中,我可以从Application类中获取OG.但是如何在图书馆处理这个?我应该为ObjectGraph添加@Provides方法吗?
非常感谢你的帮助.
编辑:简而言之:如何ObjectGraph.inject(this)在我的库项目中调用我无法访问OG的项目,因为它正在Application类中构建?
Edg*_*des 31
如果有人使用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);
}
Run Code Online (Sandbox Code Playgroud)
然后我在下面创建了Singleton以管理注射:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
当库模块中的某个类需要注入其成员时,我只是调用 DaggerWrapper.getComponent().inject(this);它而不是它.
小智 12
我是这样做的:
@Module类属于主项目,它们提供了向库元素注入的实现,因此库项目中没有@Module类
期望依赖的库元素必须能够访问ObjectGraph并自己调用.inject(),但主项目应该使用提供的@Module依赖项将ObjectGraph实例赋予库
如何将ObjectGraph从主项目导入库中?你可以有这样的界面:
interface Injector {
void inject(Object object);
public ObjectGraph getObjectGraph();
}Run Code Online (Sandbox Code Playgroud)像Activity或Application类这样的Context对象实现了这个接口(ObjectGraph对象的持有者).
如果你在库模块中有Activity的例子,它需要从主项目中注入一些东西,它将如下所示:
class LibraryActivity extends Activity {
@Inject ActivationModule instance;
void onCreate(... ) {
Injector injector = (Injector)getApplicationContext();
injector.inject(this)
}
}
Run Code Online (Sandbox Code Playgroud)
ActivationModule是库项目中的类/接口.
主项目具有应用程序类,该类实现Injector接口并创建ObjectGraph,并为库项目中的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 {
....
}
Run Code Online (Sandbox Code Playgroud)
如果您将这个库提供给人们,而他们对您的情况一无所知,那么您必须以一种使Dagger完美运行的方式编写它,而无需用户的任何帮助。(越容易进行更好的实践)
我刚刚为您编写了一些库以演示如何做。我以一种甚至可以独立运行它并在“消息”选项卡中查看结果的方式编写了该库。您库的用户不需要了解有关dagger的信息,也不需要使用他仅使用的库,并且将配置dagger:
https://github.com/amirziaratii/libraryUsingDagger.git
如果该库是您自己使用的,并且用于您自己的项目,则最佳做法是像在我朋友的这个项目中一样:
https://github.com/mmirhoseini/trakt.tv
这两个项目都回答了您所有的问题。在评论中提出任何问题和不正确的答案。
| 归档时间: |
|
| 查看次数: |
12474 次 |
| 最近记录: |