从Rust中trait的sync impl调用异步代码



我正在开发我的第一个玩具项目,该项目包含一个带有Rocket框架的简单API。但我有一个非常基本的需求,我很想让你了解如何解决它

对于某些端点,我需要调用外部REST API,因此我使用reqwest机箱来调用。我更喜欢异步调用,因为我希望我的API在该端点上有很多并发请求。

另一方面,我使用干净/六边形的体系结构指南来实现整个思想,然后我使用traits作为一种接口。这有助于测试和嘲笑。

它看起来怎么样:

pub trait DataFetcher {
fn fetch_data(path: String) -> Result<String, Box<dyn sts::error::Error>>,
}
pub struct DataProvider {
}
impl DataProvider {
pub fn new() -> Self {
// constructor here.
}
}
impl DataFetcher for DataProvider {
pub fetch_data(path: String) -> Result<String, Box<dyn std::error::Error>> {
// call to external REST API should be here.
}
}

问题来了:Rust 2018不支持异步特征方法。以下是我的猜测:

  1. 停止使用特征
  2. 使用Async_traits板条箱(实验(
  3. 其他

你有什么建议?你有一些我可以从中得到启发的例子吗?

async-trait板条箱绝对不是实验性的。它是使用最广泛的板条箱之一,也是异步fns特性的标准解决方案。

然而,如果你不需要抽象,我不会使用特征。这只会使代码变得复杂。

最新更新