将actix-web嵌入到结构中,以便我可以启动/停止服务器

时间:2019-01-16 00:18:22

标签: rust rust-actix

我正在将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及其在我的结构中可访问的功能的结构?

1 个答案:

答案 0 :(得分: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,或根据其他通用参数稍微专门研究)。