在干净的架构设置中使用 gorm 时是否需要持久性模型?

Do I need a persistence model when using gorm in a clean architecture setup?

clean architecture 软件方法中,实体是最内层,不应依赖于诸如 ORM 之类的东西。

为了方便起见,我想在我的项目中使用 ORM,而 gorm 似乎是一个流行的库。在 gorm docs the recommended way to use it is by having the gorm.Model struct 包含的结构中要持久保存在数据库中。

当尝试在我的项目中使用 gorm 并遵循干净的架构时,我最终得到了一个映射层,该映射层将我的实体映射到特定于 gorm 的持久性模型或从特定持久性模型映射,以便将 gorm 依赖性排除在我的实体之外。这似乎消除了使用 ORM 的所有好处,例如此 blog post 已明确警告。

在我看来,在遵循干净的架构的同时避免映射层只能通过使用侵入性较小的 ORM 甚至只是 sql 扩展来实现,例如sqlx 我可以在哪里直接使用我的实体?

我觉得这个问题更适合Software Engineering SE,但我会尝试回答。

您问题的简短回答是:是。

如果您想一字不差地遵循 Clean Architecture,要做的就是构建完全不依赖于您的持久层的领域模型。使用 gorm,这需要构建一个域 <-> 持久性模型映射层以及由此产生的所有增加的复杂性。 Gorm 仍将使查询和保存该持久性模型比创建您自己的查询更容易,并且与我体验过的其他语言的 ORM 相比,它仍然相当轻量级。

从技术上讲,您 不需要 在模型结构中包含 gorm.Model。拥有一个 ID int 字段,加上您想要的任何 CreatedAtUpdatedAtDeletedAt 字段就足够了(这就是 gorm.Model 给您的)。但是你总是会添加其他与 gorm 如何做事有关的工件,所以如果 gorm 包不在你的模型结构中,你就不会逃避这种依赖。

但是

这引出了一个问题,即严格遵循 Clean Arch 是否是您项目的正确决定。与所有设计决策一样,它需要权衡取舍,并且根据正在构建的系统的范围和复杂性或多或少有意义。如果您预见到您的项目将 运行 进入 Clean Arch 可以缓解的挑战,那么现在的额外投资将会得到回报。另一方面,如果体系结构的某些方面可以缓解您在特定情况下不太可能 运行 遇到的问题,那么您可能会更宽容。您链接的博客 post 的结论与此相同:

NHibernate provides the best set of trade-offs between the implementation complexity and the overall purity. There still will be ORM concerns leaking into your domain model, however. But I think it’s a low price for all the benefits you’ll get out of it: speed of development, rich functionality, and separation of concerns.