7 个稳定版本
3.3.0 | 2024 年 1 月 10 日 |
---|---|
3.2.0 | 2023 年 12 月 20 日 |
3.0.0 | 2023 年 11 月 25 日 |
2.0.0 | 2023 年 2 月 23 日 |
1.0.0 | 2022 年 10 月 6 日 |
#83 in 配置
110KB
2.5K SLoC
更多选项
更多选项是一个用于在 Rust 中定义配置选项的库。选项可以在代码中初始化,从配置中绑定,也可以通过依赖注入(DI)组合。
你可能还想要查找
功能
此 crate 提供以下功能
- default - 选项的抽象
- async - 在异步上下文中启用选项
- di - 依赖注入扩展
- cfg - 绑定配置到选项的依赖注入扩展
选项模式
选项模式使用结构体提供对相关设置的强类型访问,而无需了解设置的配置方式。设置可以在代码中显式设置,也可以来自外部配置源,例如文件。
考虑以下选项
pub struct EndpointOptions {
pub url: String,
pub retries: usize,
}
这些可能被 HTTP 客户端如下使用
use options::Options;
use std::rc::Rc;
pub struct HttpClient {
options: Rc<dyn Options<EndpointOptions>>,
}
impl HttpClient {
pub fn new(options: Rc<dyn Options<EndpointOptions>>) -> Self {
Self { options }
}
pub fn retries(&self) -> usize {
self.options.value().retries
}
}
选项在行动
定义的选项可以用多种方式使用,包括只是显式指定设置。
use crate::*;
use std::rc::Rc;
fn main() {
let options = Rc::new(options::create(EndpointOptions {
url: "https://tempuri.org",
retries: 2,
}));
let client = HttpClient::new(options);
// TODO: use the client
}
如果您期望从外部数据源处理选项,那么您几乎肯定会需要使用以下方式支持使用 serde 进行反序列化
use serde::Deserialize;
#[derive(Deserialize)]
pub struct EndpointOptions {
pub url: String,
pub retries: usize,
}
假设您有以下 appSettings.json
文件
{
"url": "https://tempuri.org",
"retries": 3
}
您可以通过包含 more-config crate 来从设置中构建选项
use crate::*;
use config::{*, ext::*};
fn main() {
let config = DefaultConfigurationBuilder::new()
.add_json_file("appsettings.json")
.build()
.unwrap();
let options: EndpointOptions = config.reify();
let client = HttpClient::new(options);
// TODO: use the client
}
您可以进一步将此配置与 more-di crate 结合起来,为您组装所有这些组件
use crate::*;
use config::{*, ext::*};
use di::*;
use std::rc::Rc;
fn main() {
let config = Rc::from(
DefaultConfigurationBuilder::new()
.add_json_file("appsettings.json")
.build()
.unwrap()
.as_config());
let provider = ServiceCollection::new()
.add(transient_as_self::<HttpClient>())
.apply_config::<EndpointOptions>(config)
.build_provider()
.unwrap();
let client = provider.get_required::<HttpClient>();
// TODO: use the client
}
许可证
本项目采用MIT许可协议。
依赖项
~37–290KB