我如何使用一个库来共享模型,而这个库应该在一个带Rust的二进制文件中直接扩展?

我如何使用一个库来共享模型,而这个库应该在一个带Rust的二进制文件中直接扩展?,rust,rust-diesel,Rust,Rust Diesel,我希望能够为我正在构建的服务共享代码库中的数据结构(模型)。 我目前已将名为域的库和名为日志服务的二进制文件中的代码拆分 在域库中,我定义了一个包含日志信息的结构,如下所示 pub struct Log { pub id: u32, pub message: String, } 在log\u服务二进制文件中,我想使用diesel作为数据库ORM,并使用域库中定义的此结构作为表。diesel文档说明,为了将此结构用作数据库表,您需要派生某些特性(例如,Queryable),并可能

我希望能够为我正在构建的服务共享代码库中的数据结构(模型)。 我目前已将名为
的库和名为
日志服务
的二进制文件中的代码拆分

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

pub struct Log {
    pub id: u32,
    pub message: String,
}
log\u服务
二进制文件中,我想使用diesel作为数据库ORM,并使用
库中定义的此结构作为表。diesel文档说明,为了将此结构用作数据库表,您需要派生某些特性(例如,
Queryable
),并可能应用其他属性

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

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

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

不。如果你必须保持项目的当前结构,这是不容易做到的

俄罗斯国家:

。。。每个trait实现必须满足以下任一条件:

  • 正在实施的特征在同一板条箱中定义

  • 特征的自我或泛型类型参数中至少有一个必须符合以下语法,其中C是包含板条箱中定义的标称类型:

  • T=C
    |&C
    |&mutc
    |盒子
    
    简单地说,trait或struct必须位于板条箱的本地,以便您实现它


    因此,您最简单的选择是为
    板条箱本身中的
    日志
    结构派生。

    为什么需要在
    中定义它,而不是
    日志服务
    ,在哪里可以直接导出所需内容?@LotB我需要在多个服务之间共享这些结构,而无需复制粘贴它们的定义,因为它们将相互利用。
     T = C
       | &C
       | &mut C
       | Box<C>