【问题标题】:Embedding actix-web into a struct so that I can start/stop server将 actix-web 嵌入到结构中,以便我可以启动/停止服务器
【发布时间】:2026-02-23 06:05:01
【问题描述】:

我正在努力将 actix-web 嵌入到绑定库中。我想在一个结构中声明一个HttpServer,以便我可以轻松调用.start().system_exit()。从我对the source code 的基本阅读来看,它已经实现为具有两个依赖项的结构:<H, F>。它还带有一个工厂来实例化自己。

如果我正确理解这一点,那么我将不得不在我的新结构中实现 HttpServer 作为依赖项,并在其中添加我自己的特征。我之前的想法是创建一个新结构,然后将HttpServer 声明为其中的一个属性。这对于需要在其中声明的泛型来说似乎很麻烦。

到目前为止,我想出的是:

struct CustomServer<T> {
    srv: T,
}

impl<T> CustomServer<T>
where
    T: HttpServer,
{
    fn init() {
        self.srv = HttpServer::new(|| App /* etc. */)
    }
}

我不确定我是在抓住稻草还是在正确的方向。

问题是:我应该/如何定义一个具有 HttpServer 的结构,并且它的功能可以在我的结构中访问?

【问题讨论】:

  • 您的问题是什么?这里没有什么让我印象深刻的。

标签: rust rust-actix


【解决方案1】:

HttpServergeneric struct,而不是 trait(所以“T: HttpServer”没有意义)。

您可以创建一个包含HttpServer 的完全任意实例化的通用结构(这对您可能不是很有用):

struct CustomServer<H: IntoHttpHandler + 'static, F: Fn() -> H + Send + Clone + 'static> {
    srv: HttpServer<H, F>,
}

impl<H: IntoHttpHandler + 'static, F: Fn() -> H + Send + Clone + 'static> CustomServer<H, F> {
    fn new(factory: F) -> CustomServer<H, F> {
        CustomServer {
            srv: HttpServer::new(factory),
        }
    }
}

或包含特定类型 HttpServer 的具体结构(我猜这就是您想要的,尽管如果没有您的用例细节很难说):

struct CustomServer {
    srv: HttpServer<App, fn() -> App>,
}

impl CustomServer {
    fn new() -> CustomServer {
        CustomServer {
            srv: HttpServer::new(|| App),
        }
    }
}

还有很多介于两者之间的点(例如,专门化 H 而不是 F,或者根据其他通用参数稍微专门化),具体取决于您要执行的操作。

【讨论】:

  • 啊啊啊啊。我最终选择了通用结构,以防我想要更大的灵活性。非常感谢,我肯定是想多了。 :-(
  • 嗯,奇怪...当我尝试初始化我得到的结构时:服务器预期的 fn 指针,发现关闭:让 server = server::new( || App::new() .middleware (中间件::Logger::default()) .default_resource(|r| r.f(index)) );好的(CustomServer {地址:address.value(),端口:port.value()作为i32,服务器:服务器})。为什么它会抱怨关闭,它遵循相同的结构。
  • 对不起,上面包含了错误,那么正是我输入结构的内容。
  • @ddibiase 函数和闭包的区别在于闭包从周围的作用域中引入变量:在本例中为index。在这种情况下,您需要在 F 中使结构通用,并使用 impl trait 来表示返回类型 (fn new() -&gt; CustomServer&lt;impl Fn() -&gt; App&gt;) 中的闭包。
  • 我明白了。我忘记了闭包会带来这样的范围。我决定使用具体结构,所以现在我正在考虑你提到的内容。抱歉,我真的很困惑,无法理解这里发生的一些事情。 :-p
最近更新 更多