ruwebframe rudi改进版Mutex对象可修改

use crate::rudi::dicontainer::direg;
use crate::rulog;
use std::sync::{Arc, Mutex};

// 单例 Bean 的统一 trait
pub trait BeanSingleton: Sized + Send + Sync + 'static {
    /// 全局唯一标识
    //const BEAN_NAME: &'static str;
    fn bean_name() -> &'static str {
        std::any::type_name::<Self>() // "rudi::di_example::DiExample" — 天然唯一!
    }
    /// 工厂方法
    fn new_bean() -> Self;

    /// 查找(统一返回 Arc<Mutex<Self>>)
    fn find_bean() -> Option<Arc<Mutex<Self>>> {
        rulog::info2("find_bean bean =》", Self::bean_name());
        direg::get_bean::<Mutex<Self>>(Self::bean_name())
        // direg::get_bean::<Mutex<Self>>(Self::BEAN_NAME)
    }

    /// 注册
    fn register_bean() {
        rulog::info2("register bean =》", Self::bean_name());
        direg::register_singleton(Self::bean_name(), || Mutex::new(Self::new_bean()));
        // direg::register_singleton(Self::BEAN_NAME, || Mutex::new(Self::new_bean()));
    }
}

这篇文章介绍了一个使用Rust实现的依赖注入(DI)容器方案,主要包含以下内容:

  1. 定义了一个BeanSingleton trait,为单例Bean提供统一接口,包括bean名称获取、创建、查找和注册方法。

  2. 展示了如何实现BeanSingleton trait,以DBDao为例,通过register_bean()注册单例,使用find_bean()获取实例。

  3. 提供了线程安全的单例访问方式,使用Arc<Mutex<T>>包装实例,确保并发安全。

  4. 演示了两种使用方式:

    • 通过全局函数find_bean_db_dao()获取实例
    • 直接通过类型调用DBDao::find_bean()

该方案利用ctor宏实现自动注册,简化了依赖管理,适用于需要单例和依赖注入的场景。

生成注册代码

 #[test]
    fn test_05_rudi() {
        find_bean_di_factroy().unwrap().lock().unwrap().make_di()
    }

// pkg data::db_dao

/*
    @Title   文件名称: db_dao_init.rs
    @Desp    描述:    依赖自动注入
    @Company 公司:    wcht.akunlong.top
    @Author  作者:    raymond@163.com  时间: 2026-08-21 09:37:25
    @Update  作者:    raymond@163.com  时间: 2026-08-21 09:37:25
*/

use crate::data::db_dao::DBDao;
use crate::rubase::{BaseEntity, BeanSingleton};
use ctor::ctor;
use std::sync::{Arc, Mutex};

#[ctor(unsafe)]
pub fn init() {
    DBDao::register_bean();
}

pub fn find_bean_db_dao() -> Option<Arc<Mutex<DBDao>>> {
    DBDao::find_bean()
}

impl BeanSingleton for DBDao {
    
    fn new_bean() -> Self {
       let mut dao= DBDao::default();
       dao.init();
       dao
    }
}

测试

  #[test]
    fn test_06_rudi() {
       let s= find_bean_db_dao().unwrap() ;
        println!("{}", s.lock().unwrap().test());
    }

    #[test]
    fn test_07_rudi() {
        let s= find_bean_db_dao().unwrap() ;
       s.lock().unwrap().doSome();
    }

结果:

使用方式1:

#[test]
fn test_07_rudi() {
    let s= find_bean_db_dao().unwrap() ;
   s.lock().unwrap().doSome();
}
 

使用方式2:

#[test]
fn test_08_rudi() {
    let s= DBDao::find_bean().unwrap() ;
    s.lock().unwrap().doSome();
}

一、WMS-数字化仓储综合管理系统简介WMS-数字化仓储综合管理系统涵盖伙伴管理、订单管理、仓储管理、质量管理、设备管理、协同办公、产品数据、基础规则、账财管理、报表管理等多个子模块。 二、功能模块:伙伴管理伙伴管理伙伴增核、伙伴档案、伙伴评价伙伴管理伙伴端采购订单、发运单伙伴管理合同管理合同条款、合同增核、合同档案、合同明细订单管理销售订单订单新增、订单总表订单管理采购订单申请增核、申请总表、计划新增、计划总表、临采增核、临采总表仓储管理仓库管理仓库总表、库区总表、库位总表仓储管理入库基础码盘规则、上架规则仓储管理入库管理采购入库、订单入库、特殊入库、入库审核、入库报检仓储管理入库管理入库总表仓储管理出库计划订单计划、出库计划仓储管理出库管理计划出库、订单出库、特殊出库、出库总表、出门证办理仓储管理移库管理移库计划、移库出库、移库入库仓储管理在库管理库存明细、库位调整、批次调整、订单调整、状态调整、周期规则、周期监控、预警规则、预警监控仓储管理盘点管理盘点计划、盘点清单、盘点差异、盘点调整质量管理质检基础质量属性、检验标准、检验规则质量管理质检过程报检明细、入库检验、质量抽检、在库检验、检验台账设备管理基础信息设备分类、设备档案、点检规则、维保规则设备管理过程管理设备点检、设备维保、故障报修、故障维修、验证评价设备管理任务管理任务列表、任务执行、任务记录、异常处理协同办公信息发布通知公告、奖惩通告协同办公组织管理组织编制、人事档案协同办公园区管理入门排队、入门登记、入门记录、出门登记、出门记录协同办公审批管理流程监听、表单配置、流程表达式、待办任务、任务总表产品数据物料管理物料分类、物料明细、物料价格、物料控制产品数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leijmdas

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值