你完全可以随意组织你的代码。这与六边形结构无关。
话虽如此,如果您想有效地使用六边形架构,您可能应该遵循域驱动设计,也就是说,您应该基于域/业务逻辑组织代码,而不是基于技术相似性。
例如,而不是具有以下结构:
controller
product
cart
customer
service
product
cart
customer
repository
product
cart
customer
DDD 推荐如下结构:
product
controller
service
repository
cart
controller
service
repository
customer
controller
service
repository
完成此操作后,如果有帮助,您可以将它们包装在三个包中,用于六边形架构的不同部分:用户端、业务逻辑和服务器端。这是我过去做过的事情;它帮助我保持不同的层次清晰。
userside
product
controller
cart
controller
customer
controller
businesslogic
product
service
cart
service
customer
service
serverside
product
service
cart
repository
customer
repository
同样,包的结构不是最重要的概念。六边形架构侧重于三个原则:
- 明确分离用户端、业务逻辑和服务器端层。清晰的包结构会有所帮助,但您可以通过其他方式分隔这些层。
- 依赖关系从用户端和服务器端层到业务逻辑。这是通过在业务逻辑中定义接口和适配器来完成的(见下文)。目标是可以在不影响业务逻辑层的情况下更改用户端和服务器端的代码。例如,如果您希望将存储库从 MySQL 实现更改为 PostgreSQL 实现(在服务器端层),此更改不应影响您的业务逻辑:新实现只需要符合业务逻辑中的接口。
- 依赖注入:业务逻辑定义接口(通常称为“端口”)和转换器(“适配器”),用户端和服务器端层必须遵守这些接口才能进行通信。
这是一个非常面向 DDD 的架构;这个想法是业务逻辑尽可能接近领域,并且不受技术要求的影响。