首页 > 解决方案 > 如何使用应该直接在 Rust 二进制文件中扩展的库共享模型?

问题描述

我希望能够在我正在构建的服务的代码库中共享数据结构(模型)。我目前已将代码拆分为一个名为的库domain和一个名为log_service.

domain库中,我定义了一个包含 Log 信息的结构,如下所示。

pub struct Log {
    pub id: u32,
    pub message: String,
}

log_service二进制文件中,我想使用柴油作为数据库 ORM,并将domain库中定义的这个结构用作表。柴油文档指出,为了将此结构用作数据库表,您需要派生某些特征(例如Queryable)并可能应用其他属性。

然而,Rust 不允许在另一个 crate 中扩展这个结构,并且由于 Rust 中不存在继承,通常可以选择使用组合来包装domainLog。但是因为diesel 使用struct 直接映射到表,所以不可能使用组合来公开字段,因为它们应该是struct 的顶层。

最好我不想在两个板条箱中复制粘贴这个结构。我一直在考虑使用宏从单一来源在两个代码库中生成这些结构,这仍然允许在二进制文件中扩展日志。

解决这个问题的最佳方法是什么?

标签: rustrust-diesel

解决方案


不,如果您绝对必须维护项目的当前结构,这不能(容易)完成。

Rust 的orphan rules状态:

...每个特征实现必须满足以下任一条件:

  1. 正在实现的 trait 是在同一个 crate 中定义的。

  2. Self 或 trait 的泛型类型参数中的至少一个必须满足以下语法,其中 C 是在包含 crate 中定义的名义类型:

 T = C
   | &C
   | &mut C
   | Box<C>

简单地说,trait 或 struct 必须在 crate 本地才能实现。

因此,对您来说最简单的选择是在crate 本身中diesel::deserialize::Queryable为您的Log结构派生。domain


推荐阅读