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 配置

MIT 许可证

110KB
2.5K SLoC

更多选项   CI Crates.io MIT licensed

更多选项是一个用于在 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