在干净的架构中,结构是这样的:
核:
核心类.java
SomeDAOInterface.java
IO
- SomeDAOInterfaceImpl.java(实现 SomeDAOInterface)
如果我应该将 Core 和 IO 拆分为不同的 .jar 文件、不同的项目,我应该如何处理 IO 部分中的“SomeDAOInterface”依赖关系?它仅包含在核心部分中,因此如果没有编译器错误(找不到类 SomeDAOInterface),我无法真正实现它。
在干净的架构中,结构是这样的:
核:
核心类.java
SomeDAOInterface.java
IO
如果我应该将 Core 和 IO 拆分为不同的 .jar 文件、不同的项目,我应该如何处理 IO 部分中的“SomeDAOInterface”依赖关系?它仅包含在核心部分中,因此如果没有编译器错误(找不到类 SomeDAOInterface),我无法真正实现它。
你所描述的远非一个不寻常的设计,周围有很多例子。例如,Java EE 声明了许多接口,这些接口将由各种容器实现。或者 Jdbc 还声明了将由数据库引擎实现的接口。
根据绑定是在构建时还是在运行时发生,有 2 种可能的设计。
当绑定发生在构建时(例如 jdbc 常见),您必须在构建时有一个可用的实现,例如您在项目中声明一个 MySQL 数据库驱动程序。在您的示例中,这意味着 IO 项目将依赖于核心项目。
当在运行时发生绑定时(例如 Java EE),您使用一个仅包含接口类(在您的示例中)而不包含用于编译的实现的虚拟SomeDAOInterface
项目,并向构建器声明不要将其链接到最终的 jar 中,而是它将在运行时提供。并且在运行时,您确实在类路径中提供了一个完整的实现,其中包含接口类(SomeDAOInterface
)和实现类(SomeDAOInterfaceImpl
在您的示例中)。你只需要阅读你的构建系统文档就知道如何声明它。或者,您可以链接核心 jar 中的虚拟项目,并声明它将在实现一中提供。
如果你在谈论 Bob 叔叔的 Clean Architecture,那么我想知道 CORE 项目是什么?
如果您指的是“实体圈”,那么如果这确实是您的核心业务规则的一部分,那么定义接口就可以了。然后,您将创建从您的 IO 项目(位于框架或接口适配器层)到根据依赖规则正确的 CORE 项目的依赖关系。
有关 Clean Architecture 中项目结构的更详细讨论,请参阅我的帖子:https ://plainionist.github.io/Implementing-Clean-Architecture-Scream/