ZihanType / rudi

Rudi - an out-of-the-box dependency injection framework for Rust -- Rudi,一个开箱即用的 Rust 依赖注入框架
Apache License 2.0
80 stars 5 forks source link

关于部分特定场景的不支持Send+Sync问题 #7

Open litcc opened 2 hours ago

litcc commented 2 hours ago

在某些 async trait 的情况下,Context 不能安全的在多线程中传递,无法在任何使用#[async_trait::async_trait]的函数参数中使用,只能在类似下方这种声明的函数中才可以正常使用

pub trait AB{

    fn abc(
         _cx: &mut Context,
         ...
    ) -> impl Future<Output = Result<...>>{
        let ddd = cx.resolve::<...>(); // 只能通过在async 外使用后移动进去,但是这样的话如果存在一些需要使用async初始化的示例时也会报错
        async move{
            // 在这里不能使用 Context,会爆一大堆错
        }
    }

}

对于 rudi::Context 内部的 Box 是否有计划添加 Send+Sync

ZihanType commented 2 hours ago

Context 只是提供一个自动构造实例的场所,应该放在程序的最开头,构造完需要的实例了,就没用了。不应该把一个场所传来传去。

litcc commented 1 hour ago

emm,我目前就是这么使用的,但开头存在一些复杂的 async trait 来抽象某些功能的情况下会出现这种情况

ZihanType commented 1 hour ago

那就不要在 async trait 中的 async fn 上添加 Send 限定,可以看看我写的 代码