跳转到内容

Rust IOC 容器搭建

  1. 定义 Chef 特性,并使用 dep-inj 库,定义 Jack 实现 Chef,宏会生成表示 Jack 状态的 JackState,以及依赖关系
  2. 定义 Waiter 特性,并使用 dep-inj-target 库(dep-inj 库无状态版),定义 Tom 实现 Waiter,以及依赖关系
  3. dep-injdep-inj-target 生成 inj_ref, prj_ref 等等方法,用来注射和投影(反射)
  4. 通过 inj_ref, prj_ref 为容器实现 Chef 和 Waiter 特性,并把有状态的 JackState 存入容器
  5. 创建容器实例,通过容器调用的时候会解析依赖关系调用依赖的方法

仓库:static-ioc

完整代码如下:

//! 厨师
/// 厨师特性
pub trait Chef {
fn cook(&self) -> &str;
}
#[derive(dep_inj::DepInj)]
#[target(Jack)]
pub struct JackState {
skill: String,
}
impl JackState {
pub fn new(skill: String) -> Self {
Self { skill }
}
}
impl<Deps> Chef for Jack<Deps>
where
Deps: AsRef<JackState>,
{
/// 我们假设厨师做饭不需要依赖其他特性,
/// 意味着它不依赖任何其他结构体。
/// 因此实际上无需为其派生 DepInj。
/// 其实以下代码即可实现:
/// pub struct Jack { skill: String }
/// impl Chef for Jack {
/// fn cook(&self) {
/// println!("{}", self.skill);
/// }
/// }
/// 此处使用 DepInj 仅作示例。
/// 若需访问 state 中的字段,必须显式指定
fn cook(&self) -> &str {
&self.skill
}
}