#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
, которая является частной. И, по-видимому, исходя из этой проблемы, это сделано специально
Чего мне не хватает? Имеет ли смысл мое предложение? Как я могу добиться того же?
Спасибо.