带有匕首2的不同范围的单个实例

问题描述 投票:1回答:1

问题

我正在构建具有动态功能的应用程序。

为了提供我正在使用的匕首2对主模块和功能模块的所有依赖关系。功能部件取决于主部件,因此,功能部件的作用域与主部件范围不同([[ C0])

注入到主模块中的接口之一在功能模块上实现,并通过反射在主模块中提供。该实现还用于功能模块中。

我的问题是主模块中提供的实例不同于功能模块中的实例(由于作用域的原因,但是我只想给一个带有匕首的实例。

代码

这里有一些代码,您可以在@Singleton中找到整个示例项目

主模块的匕首配置:

github

TestModule.kt

@Module class TestModule { @Provides @Singleton fun provideTestA() : TestA = TestAImplementation() private var testCProvider: TestC?= null @Provides @Singleton fun provideTestC(testComponent: TestComponent) : TestC { if(testCProvider != null) return testCProvider as TestC val provider = Class.forName("com.example.feature.services.TestCImplementation\$Provider").kotlin.objectInstance as TestC.Provider return provider .get(testComponent) .also { testCProvider = it } } }

TestComponent.kt

功能模块的匕首配置:

@Singleton @Component(modules = [TestModule::class]) interface TestComponent { fun inject(activity: MainActivity) fun provideTestA() : TestA }

TestDependencyModule.kt

@Module class TestDependencyModule { @Provides @TestScope fun provideTestB(): TestB = TestBImplementation() @Provides @TestScope fun provideTestC(testB: TestB): TestC = TestCImplementation(testB) }

TestDependencyComponent.kt

预期结果

接口@TestScope @Component( modules = [TestDependencyModule::class], dependencies = [TestComponent::class] ) interface TestDependencyComponent { fun inject(receiver: TestBroadcastReceiver) fun testC(): TestC } TestC被注入到TestA

接口MainActivityTestB被注入到TestA

[正如预期的那样,TestBroadcastReceiver实现的实例是唯一的,但是对于TestA的实现不是那样。因为TestB取决于TestC,所以在TestB中注入的一个与在带有TestC注释的TestBroadcastReceiver中注入的一个不同。

因此运行示例项目,您可以找到@TestScope,我得到以下日志输出

注入here的实例

MainActivity

注入D/TestB: instance 40525431 D/TestC: instance 119319268 D/TestA: instance 60713805 的实例

TestBroadcastReceiver

我想在两个模块中共享D/TestB: instance 219966227 D/TestA: instance 60713805 的相同实例。

有任何建议吗?预先感谢!

问题,我正在构建具有动态功能的应用程序。为了提供对主模块和功能模块的所有依赖关系,我使用的是匕首2。功能部件取决于主...

android kotlin dependency-injection dagger-2 dynamic-feature-module
1个回答
0
投票

TestDependencyComponent无法从对TestComponent的组件依赖关系访问TestC,因为TestComponent不会在其公共API上公开TestC。如果在TestComponent上添加TestB,我希望您在处理TestDependencyComponent时会收到重复的绑定异常。从那里,您将需要确定提供TestC实例的正确方法。

© www.soinside.com 2019 - 2024. All rights reserved.