将 actix-web 嵌入到一个结构中,这样我就可以 start/stop 服务器

Embedding actix-web into a struct so that I can start/stop server

我正在努力将 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. */)
    }
}

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

问题是:should/can 我如何着手定义一个具有 HttpServer 的结构及其在我的结构中可访问的功能?

HttpServer 是一个 generic struct, not a 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,或者根据其他通用参数稍微专门化),具体取决于您要做什么。