Rust:静态对象或类似 Java Spring 组件的东西

Rust: static objects or something like Java Spring Component

提问人:stove 提问时间:11/7/2023 更新时间:11/7/2023 访问量:27

问:

我正在使用 Rust + Iced 构建一个应用程序。我有各种服务用于创建和操作我的数据。到目前为止,我有一个包含所有服务的结构,并根据需要传递它。但是它变得越来越复杂,因此,我想知道使这个对象静态(或使用称为互斥锁的东西使服务单例)是否是 Rust 中的糟糕设计。我想要的是像 Spring Component 这样的东西。java 中的 ApplicationContext。我只是在需要的地方“自动连接”服务,或者我只是使用一些包含此服务的全局静态。

只是为了提供更多的上下文:现在我有一个服务,它需要观察其他服务的变化才能重新计算,然后为了计算,它实际上需要使用 3 个不同的服务,并且它需要是可变的。当我尝试为此实现 Observer 时,我突然不得不添加更多我移交 Services 对象的地方,它必须是可变的,因为我需要一个可变的服务。

以下是服务结构的简化:

pub mod foo_service;
pub mod bar_service;
pub mod calculated_service;
pub mod etc_service;
...

// object implementing this trait needs to be available everywhere, passing it around means having this as argument almost everywhere
pub trait LibServices {
    fn get_foo_service(&self) -> &FooService;
    fn get_bar_service(&self) -> &BarService;
    fn get_calculated_service(&self) -> &CalculatedService;
    fn get_etc_service(&self) -> &EtcService;
}
Rust 静态 互斥锁

评论

0赞 Yoric 11/7/2023
通常认为避免使用全局值是很好的做法,因为它们会使代码更难测试。现在,如果你绝对需要有全局值,你确实可以有 + ,但我不确定它是否会减少你最终会做的跟踪量。staticMutexmut
0赞 stove 11/7/2023
谢谢。我假设 Rust 中没有依赖注入这样的东西,对吧?
0赞 Yoric 11/7/2023
不是真的,但你可以使用 + 来实现类似的东西,例如staticOnceLockrust fn get_my_dependency() -> &'static Foo { static ONCE: OnceLock<Foo> = OnceLock::new(); ONCE.get_or_init(|| Foo::new()) }
0赞 stove 11/7/2023
谢谢你的提示,我会读一下这个。:)

答: 暂无答案