kotlin - 为什么作者需要在具有 Clean Architecture 的 Domain Layer 中设置依赖注入?
问题描述
我正在使用artical学习 Clean Architecture 。
我知道域层是洋葱最内部的部分(不依赖于其他层),它包含实体、用例和存储库接口。
以下代码来自项目https://github.com/lopspower/CleanRxArchitecture
GetListRepo.kt 和 RepoRepository.kt 位于 Domain Layer,可以看图 1
1:我觉得GetListRepo
类应该是抽象的还是接口的吧?
2:类的构造函数有3个参数GetListRepo
。我不明白作者为什么@Inject
要为类的构造函数添加依赖注入。我想我可以GetListRepo
在数据布局中以任何方式实例化,为什么作者需要在具有清洁架构的域层中设置依赖注入?
GetListRepo.kt
class GetListRepo
@Inject internal constructor(
private val repoRepository: RepoRepository,
useCaseScheduler: UseCaseScheduler? = null,
logger: Logger? = null
) : SingleUseCase<List<Repo>, String>(useCaseScheduler, logger) {
...
}
RepoRepository.kt
interface RepoRepository {
val isConnected: Boolean
...
}
图 1
解决方案
这类似于您关于接口/抽象类的另一个问题。我会引用自己的话:
使用这样的架构,您可以在未来创建 GetAlbumListUseCase 的替代实现并顺利切换它们。您甚至可以同时使用多个实现,例如不同的对象使用不同的实现 GetAlbumListUseCase。请注意,在您当前的架构中,所有对象都直接依赖于特定的实现,因此切换到另一个需要修改一半的代码。
想象一下你按照你的建议做了,你没有使用依赖注入,但是你GetListRepo
在代码中的任何地方都创建了对象。那么在未来您需要有两种提供数据的替代方式,例如使用本地文件和使用远程服务器。想象一下,您需要在应用程序设置中对其进行配置。或者想象一下,您需要创建单元测试,并且提供一个虚假的、测试变体的GetListRepo
.
如果你的代码在任何地方都直接实例化,你会怎么做GetListRepo
?您将需要修改代码中的许多不同位置,并将一些与加载应用程序设置等相关的逻辑放在任何地方。通过使用依赖注入,所有组件都从外部接收它们的依赖,它们不知道它们是如何被创建的,你可以将你的创建逻辑只放在一个地方。
长话短说:使用 DI 可以让我们解耦应用程序的组件。它使我们的代码更加灵活,适应不同的场景。
推荐阅读
- camera - XNA 距离向量到 HLSL float2
- pandas - 删除具有反转值的重复行
- c# - 升级到 9 后无法访问自动映射器上下文项
- java - JAVA 如何为在 2x2 矩阵中存储四个整数的二维数组编写代码?
- ruby-on-rails - 作为参数传递给稍后发送的邮件程序的活动记录实例是否有效?
- python-3.x - 在 pandas 数据框中切片日期并转换为字符串
- visual-studio-2017 - SpecFlow/MSBuild Codebehind Gen - 生成所有任务
- laravel - Laravel 政策:代码更改被忽略。是否有要清除的策略缓存?
- css - 如何制作消失的发光效果
- cmake - 如何在 CMake 中将组合编译器选项与 target_compile_options 一起传递?