如何注入动态创建的用例(android、干净的架构、dagger2)
How to inject into dynamically created use cases (android, clean architecture, dagger2)
我正在创建一个 Android 应用程序并希望遵守干净的架构。
例如,我有一个 activity,它有一个创建用例的演示者。在那个内层,我有一个存储库接口(用例已知),它由具体的存储库实现,我们称之为 repsoitoryImpl(用例不知道)。我在之前的项目中所做的是在activity中创建presenter和repositoryImpl,并将repositoryImpl作为repository传递给presenter。然后,只要有来自 activity 的操作(例如按下按钮),演示者就可以创建一个新的用例并将存储库传递给它。
这行得通,但是 a) 用例的构造函数可能变得很长 b) UI 了解所有其他 "outer" 事物,例如存储库实现。所以我想 DI 来拯救!并开始试用Dagger 2。不过,我目前的解决方案好像不是"correct"。我想要的是我可以在用例中有一个带@inject 注释的存储库,然后注入一个 repositoryImpl。但是我发现,在 "injection chain" 的开头,我必须在匕首组件上调用 inject() 。在大多数示例中,这是在 activity 中完成的。但是然后我将不得不在 activity 中注入演示者并将用例注入演示者中,以便能够将事物注入用例中。这个对吗?问题是我想用不同的参数动态创建用例而不是注入它们。
所以我目前的解决方案是将匕首 "AppComponent" 作为 Android 应用程序 class 中的静态字段,然后在我的用例中调用
Application.component.inject(this)
这允许我在用例中注入东西。但是随后用例依赖于不符合干净架构的匕首。因为框架依赖应该只出现在外层。
这个问题有通用的解决方法吗?我理解错了吗?
正如您已经在干净的架构用例中指出的那样,一定不了解 DI 框架 - 即使使用特定于框架的属性装饰用例也会有异味。
如此处所述: 构造函数参数过多通常表明用例是 "doing too much"。你应该考虑拆分它们。
此外,用例用来访问 "the details"(存储库、外部服务和系统)的接口应该以对用例最方便的方式设计。这意味着与其将多个存储库接口和多个服务接口传递给用例,不如考虑使用外观模式并设计一个或两个接口,这些接口对用例来说更方便,然后 "aggregate" 使用不同的 repositories/services。这也将减少传递给构造函数的参数数量。
根据 clean architecture,你的应用程序 "composition" 发生在 "main component" - class 生活在框架圈子中。创建并注入了对象。如果您想动态创建用例,您可以使用工厂模式。
我正在创建一个 Android 应用程序并希望遵守干净的架构。 例如,我有一个 activity,它有一个创建用例的演示者。在那个内层,我有一个存储库接口(用例已知),它由具体的存储库实现,我们称之为 repsoitoryImpl(用例不知道)。我在之前的项目中所做的是在activity中创建presenter和repositoryImpl,并将repositoryImpl作为repository传递给presenter。然后,只要有来自 activity 的操作(例如按下按钮),演示者就可以创建一个新的用例并将存储库传递给它。
这行得通,但是 a) 用例的构造函数可能变得很长 b) UI 了解所有其他 "outer" 事物,例如存储库实现。所以我想 DI 来拯救!并开始试用Dagger 2。不过,我目前的解决方案好像不是"correct"。我想要的是我可以在用例中有一个带@inject 注释的存储库,然后注入一个 repositoryImpl。但是我发现,在 "injection chain" 的开头,我必须在匕首组件上调用 inject() 。在大多数示例中,这是在 activity 中完成的。但是然后我将不得不在 activity 中注入演示者并将用例注入演示者中,以便能够将事物注入用例中。这个对吗?问题是我想用不同的参数动态创建用例而不是注入它们。
所以我目前的解决方案是将匕首 "AppComponent" 作为 Android 应用程序 class 中的静态字段,然后在我的用例中调用
Application.component.inject(this)
这允许我在用例中注入东西。但是随后用例依赖于不符合干净架构的匕首。因为框架依赖应该只出现在外层。
这个问题有通用的解决方法吗?我理解错了吗?
正如您已经在干净的架构用例中指出的那样,一定不了解 DI 框架 - 即使使用特定于框架的属性装饰用例也会有异味。
如此处所述:
此外,用例用来访问 "the details"(存储库、外部服务和系统)的接口应该以对用例最方便的方式设计。这意味着与其将多个存储库接口和多个服务接口传递给用例,不如考虑使用外观模式并设计一个或两个接口,这些接口对用例来说更方便,然后 "aggregate" 使用不同的 repositories/services。这也将减少传递给构造函数的参数数量。
根据 clean architecture,你的应用程序 "composition" 发生在 "main component" - class 生活在框架圈子中。创建并注入了对象。如果您想动态创建用例,您可以使用工厂模式。