Some of my web backend experience so far is working on a decently large C# ASP.Net Core app. In the C# app, DI and classic OOP were heavily used to make the code clean, with a separation of the data layer and routes. In Rust with actix-web, however, this is less practical since DI doesn't seem to exist in the same way. I can do something similar by having my route functions "inject" an API via
Data<MyApi>, but this seems to not support that API itself injecting things (e.g. to access the database, or to access another API).
As such, I ask, what are the design patterns that make a large Actix-web project clean?