Actix Web generic app_data

#rust #actix-web

#Ржавчина #actix-web

Вопрос:

(Я очень новичок в RUST) Я пытаюсь создать какой-то шаблон API, чтобы у нас был очень быстрый опыт начальной загрузки при создании новых микросервисов. Идея заключается не только в создании пользовательского шаблона cargo, но и в том, чтобы придерживаться некоторых ТВЕРДЫХ принципов и поддерживать порядок и ясность.

Я считаю, что полезно иметь четкое единое место для настройки маршрутов, одно для ввода зависимостей или данных и т. Д. В этом направлении я стремлюсь иметь routes.rs как часть шаблона, где разработчики добавляли бы все необходимые маршруты.

Я смог найти кое-что о маршрутах, выполнив это:

 // main.rs
mod routes;

#[actix_web::main]
async fn main() -> Result<()> {
    // ... more code...

    HttpServer::new(move || {
        App::new()
            .wrap(Logger::default())
            // Success
            .configure(routes::configure)
            // Failure
            .configure_app_data()
    })
    .bind(format!("0.0.0.0:{}", port))?
    .run()
    .await?;

    Ok(())
}

// routes.rs
pub fn configure(cfg: amp;mut ServiceConfig) {
    cfg.service(
        web::scope("/scope1")
            .route("/route", /*...*/)
            .route("/route/1", /*...*/)
            .route("/route/2", /*...*/)
    );

    cfg.service(
        web::scope("/scope2")
            .route("/", /*...*/)
            .route("/{param}", /*...*/),
    );
}
 

Теперь я сталкиваюсь с некоторыми ограничениями в отношении app_data, поскольку он ожидает статическую ссылку на определенный тип.
Я пытался создать какой-нибудь метод расширения App<AppEntry, Body> , чтобы я мог просто связать вызов с каким-нибудь очень приятным и семантическим методом, например configure_app_data() , в приложении. Что-то вроде этого:

 // app_data.rs
use actix_web::App;
use actix_web::body::Body;

pub trait AppExtensions {
    fn configure_app_data(amp;self) -> Self;
}

impl AppExtensions for App<AppEntry, Body> {
    fn configure_app_data(amp;self) -> Self {

        amp;self.data(/*...*/) 
            .app_data(/*...*/)
            .app_data(/*...*/)
            .app_data(/*...*/)
        
        amp;self
    }
}
 

Я понял, что AppEntry структура находится внутри active_service , которая является частной. И, по-видимому, исходя из этой проблемы, это сделано специально

Чего мне не хватает? Имеет ли смысл мое предложение? Как я могу добиться того же?

Спасибо.