干净的架构:在不同的 .jar 文件中分离 IO 和 Core

Clean architecture: separate IO and Core in different .jar files

在干净的架构中,结构是这样的:

核心:

IO

如果我应该将 Core 和 IO 拆分到不同的 .jar 文件、不同的项目中,我应该如何处理 IO 部分中的 "SomeDAOInterface" 依赖项?它只包含在核心部分,所以我无法在没有编译器错误的情况下真正实现它(未找到 class SomeDAOInterface)。

如果您从 Bob 叔叔那里谈论 Clean Architecture,那么我想知道 CORE 项目是什么?

如果您引用 "entities circle",那么如果这确实是您的核心业务规则的一部分,那么定义接口就可以了。 然后,您将创建从您的 IO 项目(在框架或接口适配器层中)到 CORE 项目的依赖项,根据依赖项规则这是正确的。

有关Clean Architecture中项目结构的更详细讨论,请参阅我的post:https://plainionist.github.io/Implementing-Clean-Architecture-Scream/

您所描述的远非不寻常的设计,周围有很多例子。例如 Java EE 声明了许多接口,这些接口将由各种容器实现。或者 Jdbc 也声明了将由数据库引擎实现的接口。

有 2 种可能的设计,具体取决于绑定是在构建时还是在 运行 时发生。

当绑定发生在构建时(例如常见于 jdbc),您必须在构建时有一个可用的实现,例如您在项目中声明了一个 MySQL 数据库驱动程序。在您的示例中,这意味着 IO 项目将依赖于核心项目。

当绑定发生在 运行 时间(例如 Java EE)时,您使用仅包含接口 [=35= 的 dummy 项目](SomeDAOInterface 在你的例子中)而不是编译的实现,并向构建器声明不要在最终的 jar 中 link 它,但它将 提供 在 运行 时间。在 run-time 你确实在类路径中提供了一个完整的实现,包含接口 类 (SomeDAOInterface) 实现的接口 (SomeDAOInterfaceImpl 在你的例子中)。您只需阅读构建系统文档即可了解如何声明它。 或者,您可以 link 核心 jar 中的虚拟项目,并声明它将在实现中提供。