1

我正在将 actix-web 嵌入到绑定库中。我想HttpServer在结构中声明 a 以便我可以轻松调用.start()and .system_exit()根据我对源代码的非常基本的阅读,它已经实现为具有两个依赖项的结构:<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 的结构,并且它的功能可以在我的结构中访问?

4

1 回答 1

2

HttpServer是一个通用结构,而不是一个特征(所以“<code>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),
        }
    }
}

两者之间也有很多点(例如,specialize Hbut not F,或基于其他通用参数稍微专门化),具体取决于您要执行的操作。

于 2019-01-16T05:52:54.513 回答