【问题标题】:How to inject into dynamically created use cases (android, clean architecture, dagger2)如何注入动态创建的用例(android、clean architecture、dagger2)
【发布时间】: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


【解决方案1】:

正如您在干净的架构用例中已经指出的那样,一定不能了解 DI 框架 - 即使用框架特定属性装饰用例也是一种气味。

正如这里所讨论的:How to handle UseCase Interactor constructors that have too many dependency parameters in DDD w/ Clean Architecture? 有太多的构造函数参数通常表明用例“做得太多”。你应该考虑拆分它们。

此外,用例用来访问“细节”(存储库、外部服务和系统)的接口应该以最方便用例的方式设计。这意味着您可以考虑使用外观模式并设计一两个更方便用例的接口,而不是将多个存储库接口和多个服务接口传递给用例,然后将工作与不同的存储库/服务“聚合” .这也将减少传递给构造函数的参数数量。

根据干净的架构,您的应用程序的“组合”发生在“主要组件”中 - 一个生活在框架圈子中的类。有对象被创建和注入。如果您想动态创建用例,您可以使用工厂模式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-19
    • 1970-01-01
    相关资源
    最近更新 更多