ts简单实现ioc,aop,功能

本文介绍了如何使用IoC容器和AOP实现简单的依赖注入,以及如何通过注解和路由映射来调用相应的函数,包括参数注入。通过模拟API调用来展示整个过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
 * @description: 简单的ioc,aop 实现
 * @return {*}
 * @author: 
 */


// ioc 容器
class IocContainer {
  private map = new Map();
  constructor() {

  }

  provider(token,target) {
    this.map.set(token,target)
  }

  get(token) {
    return this.map.get(token)
  }

  getMap() {
    return this.map
  }
}

// 创建ioc容器
const iocContainer:IocContainer = new IocContainer()


// 注解
const injectable = ()=> {
  return (target) =>{
    // 构造函数 target 
    iocContainer.provider(target.name,new target())
  }
}


// 路由 路由对应函数
const Get = (url)=> {
  return (target,key,descriptor)=> {
    // target 为原型对象
    // key 为函数属性名
    // descriptor 为函数属性描述符
    // const token = `${target.constructor.name}-${url}`
    const token = `${url}`
    iocContainer.provider(token,descriptor.value)
  }
}

// 参数
const Req = (val)=>{
  return (target,key,descriptor)=> {
    // target 为原型对象
    // key 为函数属性名
    // descriptor 为函数属性描述符 index 

    // 获取函数数can的唯一token 
    const token = `${target.constructor.name}${key}`

    // 获取函数参数
    if(target.hasOwnProperty(`${key}params`)) {
      target[`${key}params`][descriptor] = val
    } else {
      target[`${key}params`] = []
      target[`${key}params`][descriptor] = val
    }

    
    // 设置参数
    iocContainer.provider(token,target[`${key}params`])
  }
}

// 注解方式
@injectable()
class A {
  constructor() {
  }
  @Get('/get')
  getHello(@Req('get')req,@Req("11")req1) {
    console.log(req,req1);
  }
  @Get('/post')
  getHello1(@Req('post')req) {
    console.log(req);
  }
  @Get('/put')
  getHello2(@Req('put')req) {
    console.log(req);
  }
}



// 模拟api调用
const demoApi = ()=>{
  const urls = ['/get','/post','/put']

  // 随机数字0-2
  const index = Math.floor(Math.random() * 3)

  // 获取路由
  const url = urls[index]

  // 获取方法
  const method = iocContainer.get(url)

  // 获取参数
  const token = A.name + method.name 

  // 获取参数
  const data =iocContainer.get(token)

  // 传入参数并调用
  method && method(...data)
}


// 调用demoApi
demoApi()




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值