我正在将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及其在我的结构中可访问的功能的结构?
答案 0 :(得分:1)
HttpServer
是generic 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
,或根据其他通用参数稍微专门研究)。