/**
* @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()
ts简单实现ioc,aop,功能
最新推荐文章于 2024-09-11 09:40:05 发布