将 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
,或者根据其他通用参数稍微专门化),具体取决于您要做什么。
我正在努力将 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
,或者根据其他通用参数稍微专门化),具体取决于您要做什么。