Articles of dependency injection

具有相同返回types的@Named提供程序最终会给出java.lang.IllegalArgumentException:Duplicate

这是问题, 我正在开发一个LibGDX项目,我有不同平台的不同模块。 这是我的android模块的样子: @Module( includes = {BaseModule.class, NetModule.class}, injects = {DummyProjectActivity.class, DummyProject.class}, overrides = true) public class DummyProjectAndroidModule { … @Provides @Singleton @Named(“DummyOne”) DummyInterface provideDummyOne() { return new DummyOne(); } @Provides @Singleton @Named(“DummyTwo”) DummyInterface provideDummyTwo() { return new DummyTwo(); } @Provides @Singleton @Named(“DummyConsumer”) DummyConsumer provideDummyConsumer(@Named(“DummyOne”) DummyInterface dummyOne, @Named(“DummyTwo”) DummyInterface dummyTwo) { return new DummyConsumer(dummyOne, dummyTwo); […]

Dagger 2注入构造函数

我开始在我正在开发的应用程序中使用Dagger 2,但我对Dagger 2的工作方式有一些疑问。 我得到了@Provides方法和@Inject注释背后的所有逻辑来初始化你的依赖关系,但@Inject注释到类构造函数有点像我的想法。 例如: 我的应用程序,我有一个模块定义,ContextModule,以检索我的应用程序的上下文: ContextModule.java @Module public class ContextModule { private final Context context; public ContextModule(Context context) { this.context = context; } @Provides public Context context() { return this.context; } } 我的BaseActivityComponent使用此模块: BaseActivityComponent.java @BaseActivityScope @Component(modules = ContextModule.class) public interface BaseActivityComponent { void injectBaseActivity(BaseActivity baseActivity); } 到目前为止很好..然后我有一个AuthController类,这取决于上下文,我想在我的BaseActivity中注入它。 所以在我的AuthControllers.class中我有类似的东西: public class AuthController { private Context […]

Butterknife View注射

我偶然发现了一个名为ButterKnife的非常有趣的dependency injection库。 使用ButterKnife可以很容易地将Views注入活动或片段。 class ExampleActivity extends Activity { @InjectView(R.id.title) TextView title; @InjectView(R.id.subtitle) TextView subtitle; @InjectView(R.id.footer) TextView footer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.simple_activity); ButterKnife.inject(this); // TODO Use “injected” views… } } 但是,如果使用dependency injection,那些视图必须是public以便Butterknife可以注入它(使用private字段会导致exceptionfields must not be private or static )。 在我过去的项目中,我总是将所有成员字段(包括视图)设为private因为我认为这是最佳实践(信息隐藏等)现在我想知道是否有理由不应该public所有视图? 在这种情况下,我不能使用ButterKnife但我想使用它,因为它大大简化了代码。

Dagger 2注入Android Context

我正在使用Dagger 2并使其工作,但我现在需要访问Android应用程序上下文。 我不清楚如何注入和访问上下文。 我试过这样做如下: @Module public class MainActivityModule { private final Context context; MainActivityModule(Context context) { this.context = context; } @Provides @Singleton Context provideContext() { return context; } 但是,这会导致以下exception: java.lang.RuntimeException:无法创建应用程序:java.lang.IllegalStateException:必须设置mainActivityModule 如果我检查Dagger生成的代码,则会在此处引发此exception: public Graph build() { if (mainActivityModule == null) { throw new IllegalStateException(“mainActivityModule must be set”); } return new DaggerGraph(this); } 我不确定这是否是注入Context的正确方法 – 任何帮助将不胜感激。

Dagger 2:@ Component.Builder缺少所需模块或组件的setter:`

我正在配置新的Dagger Android模块但我收到此错误这是我的组件: @AppScope @Component(modules = {AppModule.class, NetModule.class}) public interface AppComponent { @Component.Builder interface Builder { @BindsInstance Builder application(ExampleApplication application); @BindsInstance Builder appModule(AppModule appModule); @BindsInstance Builder netModule(NetModule netModule); AppComponent build(); } void inject(ExampleApplication __); … 我在我的应用程序中构建了这样的内容 appComponent = DaggerAppComponent .builder() .application(this) .appModule(new AppModule(this)) .netModule(new NetModule()) .build() .inject(this); 但我仍然收到错误 错误:(20,3)错误:@ Component.Builder缺少所需模块或组件的setter:[app.example.com.dagger.AppModule] 根据应该是正确的文件,我错过了什么? 例如,这可能是一个带有Builder的有效组件: @Component(modules = {BackendModule.class, FrontendModule.class}) […]

使用Dagger 2进行方法注射

我没有设法使用Dagger 2find关于方法注入的好解释/示例。有人可以帮我理解吗? 例: @Inject public Dinner makeDinner(Pasta pasta, Sauce sauce) { mPan.add(pasta); mPan.add(sauce); return mPan.cookDinner(); } 因此,如果我用@Inject注释我的方法,我是否正确假设方法签名中的参数将从对象图中注入定义的对象? 我如何在我的代码中使用此方法呢? 当我进行方法调用时,它仍然期望我提供所有参数,这会破坏目的。 更新: 因此,根据我的理解,如果我调用DinnerComponent.dinner() ,则可以使用Dinner对象,假设我的DinnerComponent设置如下: @Component(modules = DinnerModule.class) public interface DinnerComponent { Dinner dinner(); } 我的DinnerModule设置如下: @Module public class DinnerModule { public DinnerModule() {} @Provides Pasta providePasta() { return new Pasta(); } @Provides Sauce provideSauce() { return new […]

Dagger 2范围和子组件

我正在努力使我的应用程序更好,代码更易于使用Dagger2我抓住了一般的想法,但仍然无法弄清楚范围是如何管理Dagger2我把dagger注入我的项目(听起来很有趣)。 我创建了ApplicationComonent组件,它在我的项目中完美运行。 这是我的代码。 @Singleton @Component(modules = { ApplicationModule.class, ThreadingModule.class, NetworkModule.class, DatabaseModule.class, ServiceModule.class, ParseModule.class, PreferencesSessionModule.class}) public interface ApplicationComponent { ActivityComponent activityComponent(ActivityModule activityModule); void inject(BaseActivity baseActivity); void inject(MainAppActivity mainAppActivity); void inject(MyApplication application); void inject(BaseFragment baseFragment); void inject(MyService service); void inject(RegistrationIntentService service); } 我在MyApplication类中创建我的组件实例 private void initializeAndInjectComponent() { mApplicationComponent = DaggerApplicationComponent .builder() .threadingModule(new ThreadingModule(1)) .applicationModule(new ApplicationModule(this)) .networkModule(new NetworkModule( […]

Dagger 2组件,模块和范围的生命周期

我已经阅读了很多关于匕首2的post和教程: http://frogermcs.github.io/dependency-injection-with-dagger-2-custom-scopes/ https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2 http://fernandocejas.com/2015/04/11/tasting-dagger-2-on-android/ https://github.com/konmik/konmik.github.io/wiki/Snorkeling-with-Dagger-2 什么决定了Dagger 2中组件(对象图)的生命周期? 等等 但我仍然对组件的生命周期以及它与模块和范围的关系感到困惑。 我想确保在我只需要Singleton时不创建对象的多个实例。 希望有人可以对这些有所了解: 在应用程序类中构建的组件的生命周期是什么? 在Activity或Fragment类中构建的组件的生命周期是什么? 如果我想从组件中获取单例实例,是否必须使用@Singleton或自定义范围注释组件并在应用程序类中构建该组件? 如果我在应用程序类中构建一个组件,这是否意味着通过此组件可用的所有对象实例将是整个应用程序中的单例实例,直到该应用程序被终止或重新启动? 我有一个带有自定义范围的组件,比如@ActivityScope,我在Activity中构建该组件,在调用onDestroy()之后,通过该组件注入的对象实例会自动销毁吗? 同样,我有一个带有自定义范围的组件,比如@ActivityScope,我在ActivityA和ActivityB中构建这个组件,ActivityA和ActivityB是否会从这个组件共享相同的对象实例,或者它们将拥有自己的同一对象实例?

使用Dagger在构造函数上进行dependency injection

所以,我正在重新设计我的Android应用程序以使用Dagger 。 我的应用程序庞大而复杂,我最近遇到了以下情况: 对象A需要一个特殊的DebugLogger实例,这是一个完美的注入候选者。 我可以通过A的构造函数注入它,而不是绕过记录器。 这看起来像这样: class A { private DebugLogger logger; @Inject public A(DebugLogger logger) { this.logger = logger; } // Additional methods of A follow, etc. } 到目前为止这是有道理的。 但是,A需要由另一个类B构造。必须构造A的多个实例,因此遵循Dagger的做事方式,我简单地将Provider注入B: class B { private Provider aFactory; @Inject public B(Provider aFactory) { this.aFactory = aFactory; } } 好的,到目前为止还不错。 但等等,突然A需要额外的输入,例如一个称为“数量”的整数,这对于它的构造至关重要。 现在,我的A构造函数需要如下所示: @Inject public A(DebugLogger logger, int […]

如何使用Dagger为活动和碎片以外的东西设置dependency injection?

我开始使用Dagger设置dependency injection,如下所示。 因为我可能有错误,所以请鼓励我更正我的实施! 该实现遵循项目提供的android-simple示例 。 在下文中,您可以看到我是如何成功为Activities和Fragments添加dependency injection的。 我现在试着保持简单,所以我决定将Timber注入Android的log util的记录器替换。 import android.app.Application; import java.util.Arrays; import java.util.List; import dagger.ObjectGraph; import com.example.debugging.LoggingModule; public class ExampleApplication extends Application { private ObjectGraph mObjectGraph; protected List getModules() { return Arrays.asList( new AndroidModule(this), new ExampleModule(), new LoggingModule() ); } private void createObjectGraphIfNeeded() { if (mObjectGraph == null) { Object[] modules = getModules().toArray(); […]