Are you saying 95% of use cases require spawning new tasks within the trait implementation based on argument futures? Or are you making a more general comment about rust generics? The MVP looks about as clean as I could hope for most use cases.
I am saying that in web services you will frequently use async functions that
look like async fn do_blah(db_repo: impl DBRepo ...) {...} and are executed on
async-std or Tokio
One would typically not spawn those - as I understand it you need the type constraints if calling “tokio::spawn” (or some equivalent) but not if simply calling an async function in the same task.