Articles of dependency injection

非活动Java类中的Dagger 2注入

我正在尝试使用Dagger2进行DI,它对于有onCreate生命周期事件的Activity / Fragment相关类非常适用。 现在我有一个普通的Java类,我想要注入它。 任何关于如何去做的想法将不胜感激。 我的代码看起来像这样: BasicMoviesUsecaseComponent.java – @PerActivity @Component(dependencies = AppComponent.class, modules = BasicMoviesUsecasesModule.class) public interface BasicMoviesUsecasesComponent { void inject(PaymentsManager paymentsManager); } DatabaseModule.java – @Module public class DatabaseModule { @Provides @Singleton Realm provideRealmInstance(Context context) { return Realm.getInstance(context); } @Provides @Singleton DatabaseProvider provideDatabaseInstance(Realm realm) { return new DatabaseProvider(realm); } @Provides @Singleton SharedPreferences provideSharedPrefs(Context context) { […]

Android上的Dagger 2:在Activity中注入相同的依赖项并保留Fragment

我有类F1和F2对象,我想在保留的片段中注入。 我还有一个依赖于Activity的A类对象,我希望它被注入到该Activity中,并且附加到该Activity的Fragment Manager中的保留Fragment中。 我写下面的代码。 首先,Activity依赖的模块: @Module public class MainActivityModule { private Activity mActivity; public MainActivityModule(Activity activity) { mActivity = activity; } @Provides @ActivityScope public A provideA() { return new A(mActivity); } } 然后,相应的组件必须使A对象可用于其依赖组件: @ActivityScope @Component(modules = {MainActivityModule.class}) public interface MainActivityComponent { void inject(MainActivity activity); // make the A object available to dependent components A getA(); […]

私有字段上的Android Daggerdependency injection失败

我是匕首的新手(虽然我有使用Weld从事Java EE WebApps的DI经验)。 我要做的是将dependency injection类中。 这个领域是私人的。 然后Dagger抛出exception声明它无法注入私人领域。 这是什么原因? 毕竟有可能使用reflection写入私有字段,即使在android上也是如此。 如果我将字段的可见性设置为非私有,则注入似乎有效。

使用覆盖模块扩展ObjectGraph

我现在和Dagger一起玩,显然有些function对我不起作用。 我实际上是尝试使用模拟模块扩展我的ObjectGraph(通过ObjectGraph.plus() ),模拟模块覆盖已创建的图形中的一个真实模块。 但显然我的模拟模块被忽略了,所以调用了真正的接口。 但是,如果我尝试在图形创建阶段提供我的模拟模块 – 一切正常.. 在我的例子中, MockModule1覆盖了RealModule1提供者 不起作用 : objectGraph = ObjectGraph.create(new RealModule1(), new RealModule2(), new RealModule3()); objectGraph = objectGraph.plus(new MockModule1()); 工作正常 objectGraph = ObjectGraph.create(new RealModule1(), new RealModule2(), new RealModule3(), new MockModule1()); RealModule1.java @Module(injects = MainActivity.class) public class RealModule1 { @Provides ISomething provideSomething() { return new Something(); } } MockModule1.java @Module(overrides=true, injects = […]

使用Dagger 2注入服务

我有一个应用程序,它基本上是一个始终运行的服务,并在发生事件时向用户发出警报。 当服务创建警报时,它需要为其提供context以便警报可以在发生某些事情时对服务进行回调 。 例如: public MyService extends Service{ private SomeAlarm alarm; @Override public void onCreate() { super.onCreate(); alarm = new SomeAlarm(MyService.this); } } 如何将SomeAlarm类注入服务,并将SomeAlarm服务上下文作为variables?

Dagger:IllegalArgumentException:没有为Class绑定的进程工厂

我是Dagger 2的新手。我有2个活动,我想使用注入的ViewModel。 这是我的ViewModuleFactory : @Singleton public class ProductViewModelFactory implements ViewModelProvider.Factory { private final Map<Class, Provider> creators; @Inject public ProductViewModelFactory(Map<Class, Provider> creators) { this.creators = creators; } @SuppressWarnings(“unchecked”) @Override public T create(Class modelClass) { Provider creator = creators.get(modelClass); if (creator == null) { for (Map.Entry<Class, Provider> entry : creators.entrySet()) { if (modelClass.isAssignableFrom(entry.getKey())) { creator = entry.getValue(); […]

如何在自定义视图或其他Android类中使用AndroidInjection类?

我对Android特定模式的问题是,如果使用他们的AndroidInjection类,除了Application Component之外,除了Activities / Fragments /自定义视图/适配器之外,成员无法注入其他对象。 这是因为您无法获得用于注入Activities / Fragments的Subcomponent ( AndroidInjector )的引用。 这使得注入Dialogs(如果您使用DialogFragments )。 AndroidInjection类似乎只支持核心Androidtypes。

让Dagger在为Android进行espressofunction测试时注入模拟对象

我最近和Dagger一起吃饱了,因为DI的概念完全合情合理。 DI的一个更好的“副产品”(杰克沃顿在他的一个演讲中提出)更容易测试。 所以现在我基本上使用浓缩咖啡做一些function测试,我希望能够将虚拟/模拟数据注入应用程序并让活动显示出来。 我猜,因为这是DI的最大优势之一,这应该是一个相对简单的问题。 出于某种原因,我似乎无法绕过它。 任何帮助将非常感激。 这是我到目前为止(我写了一个反映我当前设置的例子): public class MyActivity extends MyBaseActivity { @Inject Navigator _navigator; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyApplication.get(this).inject(this); // … setupViews(); } private void setupViews() { myTextView.setText(getMyLabel()); } public String getMyLabel() { return _navigator.getSpecialText(); // “Special Text” } } 这些是我的匕首模块: // Navigation Module @Module(library = true) public class NavigationModule […]

Dagger 2 – two提供了提供相同接口的方法

让我说我有: public interface Shape {} public class Rectangle implements Shape { } public class Circle implements Shape { } 我有一个ApplicationModule ,它需要为Rec和Circle提供实例: @Module public class ApplicationModule { private Shape rec; private Shape circle; public ApplicationModule() { rec = new Rectangle(); circle= new Circle (); } @Provides public Shape provideRectangle() { return rec ; } @Provides public […]

在Android上使用DI的具体好处是什么?

使用Androiddependency injection框架的具体优势或优势是什么,如Dagger , Transfuse或RoboGuice ? 例如,什么样的应用程序从使用DI中受益最多? 是否有更多的性能优势,或者更多的是扩展应用程序的简易性,还是更多关于使其可测试? 问这个问题的原因之一是衡量我正在开发的应用程序是否真的会受益于它或者不是很多。 由于我打算在某些方面认真对待应用程序,可测试性和易于扩展性将是很好的,即使第一版本使用成本高(更多时间设置,学习曲线等)。 谢谢!