【发布时间】:2018-08-10 12:48:48
【问题描述】:
我正在创建一个 Android 应用,并希望遵守干净的架构。 例如,我有一个活动,它有一个创建用例的演示者。在那个内层,我有一个由具体存储库实现的存储库接口(用例知道),我们称之为 repsoitoryImpl(用例不知道)。我在之前的项目中所做的就是在activity中创建presenter和repositoryImpl,并将repositoryImpl作为repository传递给presenter。然后,只要 Activity 有动作(例如按下按钮),演示者就可以创建一个新用例并将存储库传递给它。
这可行,但是 a) 用例的构造函数可能会变得很长 b) UI 了解所有其他“外部”事物,例如存储库Impl。所以我想DI来救援!并开始尝试 Dagger 2。但是,我目前的解决方案似乎并不“正确”。我想要的是我可以在一个用例中拥有一个带有@inject 注释的存储库,并且一个repositoryImpl 被注入。但是我发现,在“注入链”的开头,我必须在 dagger 组件上调用 inject() 。在大多数示例中,这是在活动中完成的。但是我必须将演示者注入到活动中,并将用例注入到演示者中,以便能够将内容注入到用例中。它是否正确?问题是我想用不同的参数动态创建用例而不是注入它们。
所以我目前的解决方案是将匕首“AppComponent”作为Android应用程序类中的静态字段,然后在我的用例中调用
Application.component.inject(this)
这允许我在用例中注入东西。但是随后用例依赖于不符合干净架构的匕首。因为框架依赖应该只出现在外层。
这个问题有通用的解决方案吗?我是不是理解错了?
【问题讨论】:
-
你看过构造函数注入吗?
.inject()应该主要用于注入 Android 框架组件,而不是您编写的每个类 -
为什么需要动态创建用例?提供不同用例的条件是什么?
-
@Benjamin 我想动态创建它们,因为它们具有动态参数。例如,我想调用
new CreateHouseUseCase(doors, windows, callback).execute()@DavidMedenjak 是的,我知道构造函数注入,但是当我“手动”创建用例时,参数不会被注入,是吗? -
不,如果您自己创建对象,则不会注入字段。但是你可以在你的presenter中注入一个
Provider<MyUseCase>,然后调用provider.get()来创建一个新的用例对象(将被构造函数注入) -
感谢你们俩。门、窗和回调应该是我不想注入的东西。例如,用例可以调用
repository.addHouse(new House(doors, windows)); callback.onSuccess(),只需要注入存储库。尤其是回调,例如当然取决于谁创建了用例。 @DavidMedenjak 使用此provider.get()时,我可以传递动态参数吗?并获得一个同时具有这些传递的参数和注入的东西的用例?是的,我认为这就是我的问题的答案!
标签: android dependency-injection dagger-2 clean-architecture