我正在构建具有动态功能的应用程序。
为了提供我正在使用的匕首2对主模块和功能模块的所有依赖关系。功能部件取决于主部件,因此,功能部件的作用域与主部件范围不同([[ C0])
注入到主模块中的接口之一在功能模块上实现,并通过反射在主模块中提供。该实现还用于功能模块中。
我的问题是主模块中提供的实例不同于功能模块中的实例(由于作用域的原因,但是我只想给一个带有匕首的实例。
这里有一些代码,您可以在@Singleton
中找到整个示例项目
主模块的匕首配置:
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
中
接口MainActivity
和TestB
被注入到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。功能部件取决于主...
TestDependencyComponent无法从对TestComponent的组件依赖关系访问TestC,因为TestComponent不会在其公共API上公开TestC。如果在TestComponent上添加TestB
,我希望您在处理TestDependencyComponent时会收到重复的绑定异常。从那里,您将需要确定提供TestC实例的正确方法。