Articles of dependency injection

尽管Dagger可以生成点文件,但它无法创建对象图

在现有的应用程序中,我正在努力设置Dagger(1.0.1)。 它被配置为使用ProGuard但我使用-dontobfuscate禁用了此测试。 当我启用dagger-compiler时,它能够成功生成带有依赖关系图的点文件,但是当我删除编译器并在Release模式下构建应用程序时,它会在启动期间崩溃,抱怨它无法创建对象图。 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.corp.myapp/com.corp.myapp.ui.activity.MainActivity}: java.lang.IllegalStateException: Errors creating object graph: No injectable members on com.corp.myapp.core.services.ConnectionMonitor. Do you want to add an injectable constructor? required by com.corp.myapp.core.services.ConnectionMonitor com.corp.myapp.ui.activity.MyAppBaseActivity.connectionManager No injectable members on com.corp.myapp.ui.crouton.CroutonManager. Do you want to add an injectable constructor? required by com.corp.myapp.ui.crouton.CroutonManager com.corp.myapp.ui.activity.MyAppBaseActivity.croutonManager No injectable members on com.corp.core.assembler.ResourceAssembler. Do you […]

Dagger 2:从多个子组件注入活动

本教程将演示如何使用Dagger 2的AndroidInjectionModule将依赖项注入活动 – 这是一个非常简单的示例。 我的用例有点复杂: App extends Application implements HasDispatchingActivityInjector , 使用ActivityModule初始化的ActivityModule 。 使用此活动,创建依赖关系DepOne , ActivityTwo具有依赖性DepTwo ,如果没有预先存在的DepOne ,则无法正确初始化。 我想出的解决方案是: 创建一个AppComponent作为应用程序的主要组件, 创建ComponentTwo作为AppComponent的子组件。 只要DepOne可用,就在运行时添加它,并在其中提供DepTwo , 在ComponentTwo注入ActivityTwo 。 但是,这需要ActivityModule ,它目前看起来像这样: @Module(subcomponents = { ActivityOneSubcomponent.class, ActivityTwoSubcomponent.class }) public abstract class ActivityModule { @Binds @IntoMap @ActivityKey(ActivityOne.class) abstract AndroidInjector.Factory bindLoginActivityInjectorFactory(ActivityOneSubcomponent.Builder builder); @Binds @IntoMap @ActivityKey(ActivityTwo.class) abstract AndroidInjector.Factory bindWorldActivityInjectorFactory(ActivityTwoSubcomponent.Builder builder); } 分为两个不同的模块,一个用于ActivityOne并与AppComponent绑定,另一个用于ActivityTwo (以及其他未来活动)与ComponentTwo绑定。 […]

在方向改变时处理匕首组件

假设这里已经说过,开发人员有责任保留组件实例以实现自己的范围逻辑(因为范围方法将为给定组件返回相同的实例)。 通过活动生命周期保持此组件引用的干净方法是什么? 示例:您正在实施MVP模式,因此您需要在Activity中使用Presenter。 此演示者可以执行网络操作来下载项目。 当设备旋转时,您的Activity将被销毁并重新创建,但您希望保持网络运行,并且只需返回预旋转演示者。 为提供Presenter的组件定义一个自定义PerActivity范围是解决方案,因此您必须通过此循环保持Component实例,以便在首次启动Activity时注入相同的Presenter实例。 我们怎么处理这个? 我想到了一种组件缓存(如HashMap?),它可以由生活在Application类中的Application Component提供。

使用RoboGuice 2.0的Android应用程序 – 如何使用Application上下文注入Singleton

我有一个GameStateManager单例,我想让我的所有活动都可用。 特别是我希望它使用Application Context而不是单独的Activity Context来监听使用EventManager触发的事件。 GameStateManager标有单例注释 我试着在Application.OnCreate期间注入GameStateManager(抱歉,从内存中输入以下代码片段,没有复制和粘贴,所以可能不正确) public void OnCreate(){ GameStateManager gameStateManager = RoboGuice.InjectMembers(this.getApplicationContext(), new GameStateManager()) } 我认为GameStateManager的实例将使用应用程序上下文构造,因为它被注释为单例,因此稍后可以使用应用程序上下文。 我注意到的是,当我将GameStateManager注入到一个活动中时,我实际上得到了一个与活动上下文相关联的新单例。 所以本质上我有2个单身:) 关于如何拥有一个连接到Application上下文的真正“单例”的任何想法? 谢谢!

注入Otto事件总线而不是使用静态单例的优点

在我的Android应用中,我使用Otto作为事件总线,使用Dagger进行dependency injection。 在Otto的用户指南和许多博客文章中,建议使用注入来获取总线单例。 我已经做了一段时间,但最近我更加怀疑如果注入总线比使用简单的静态单例有任何优势。 使用注入我必须注入我希望能够在总线上发布UI事件的每个自​​定义View或ViewHolder。 特别是匕首,在我需要公共汽车的地方注入每个class级似乎有点笨拙。 当然,我可以通过构造函数或setter方法传递总线,但如果您考虑具有许多不同视图types的适配器,那也可能有点笨拙。 我注意到注入总线没有任何好处。 在Otto的情况下,注入了一个具体实现(Bus的一个实例)并且永远不会改变。 由于订阅的工作方式,包装Otto进行解耦是没有任何意义的。 那么,有没有人看到注入奥托的任何优点,我看不到?

使用Dagger和Robolectric注入服务

我正在尝试使用Dagger注入TelephonyManager服务。 我正在关注这个样本 。 我扩展了Application类以创建图形并定义了一个ApplicationModule ,其中包含ServiceModule ,将来还会包含其他模块。 编辑: 现在,系统服务被注入到Activity而没有任何问题。 我在Activity缺少FinderApplication.inject(this) 。 它有一个注射但仍然没有在Robolectric测试下注射。 我在这篇文章的底部添加了测试用例: Edit-2: ApplicationModule已删除并创建了BaseActivity : ((FinderApplication) getApplication()).getGraph().inject(this); on onCreate方法。 我得到的错误是: 引起:java.lang.NoSuchMethodException:ServiceModule。() 但是如果我定义一个空构造函数,那么在需要注入的类时我会得到一个空指针。 FinderApplication.java public class FinderApplication extends Application { private ObjectGraph mObjectGraph; @Override public final void onCreate() { super.onCreate(); mObjectGraph = ObjectGraph.create(new ServiceModule(this)); } public final ObjectGraph getGraph() { return mObjectGraph; } } ServiceModule.java @Module(entryPoints […]

如何将dependency injection嵌套的android片段?

对于普通(非嵌套片段),我使用以下方法 1)创建依赖关系(…)方法来设置片段的依赖关系 class MyFragment extends MyFragment { void dependencies(Deps deps); } 2)在MyFragment parent的活动onAttachFragment()方法中,我只提供片段的依赖关系 class MyActivity{ void onAttachFragment(Fragment f){ ((MyFragment)f).dependencies(deps); } } 对于嵌套片段,不再有onAttachFragment片段被调用。 为片段提供依赖性只是为了提供嵌套片段的依赖性,这似乎非常麻烦。 那我怎么能为它提供依赖呢?

使用匕首2查看dependency injection

我有一个扩展TextView的自定义视图。 我应该在哪里调用我的组件来注入视图? component.inject(customTextView);

RoboFragment中的InjectView

我想从xml布局注入一些视图到RoboFragment但不幸的是我得到了Nullpointerexception。 由于RoboGuice(除了是一个很好的DI框架)只有很少的文档,我不知道我是否可以使用@ContentView(R.layout.fragmentlayout)来注释我的RoboFragment。 我应该做些什么呢? 我目前做的是: public class TestFragment extends RoboFragment { @InjectView(R.id.upBtn) private Button upBtn; @Override public View onCreateView(LayoutInflater layoutInflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(layoutInflater, container, savedInstanceState); View view = layoutInflater.inflate(R.layout.fragmentlayout, container, false); RoboGuice.getInjector(getActivity()).injectMembers(this); upBtn.setSelected(false); // <—— Null pointer here return view; } }

Transfuse与Dagger相比如何?

我正在尝试决定是否使用Transfuse或Dagger进行Androiddependency injection。 我从未使用过Transfuse,并且对Dagger有基本的了解。 非常感谢。