├── src
│ ├── constants.ts // 常量
│ ├── controller.ts // @controller 裝飾器
│ ├── index.ts // 入口檔案
│ ├── injectable.ts // @injectable 裝飾器,宣告可被注入的類
│ ├── injector.ts // 注射器
│ ├── inte***ce
.ts│ ├── request.ts // http請求方法的裝飾器, @get @post
│ ├── router.ts // 載入路由
│ └── utils.ts
├── package
-lock.json
├── package
.json
├── tsconfig.json
└── tslint.json
1. 定義http請求方法的裝飾器// request.ts
import
'reflect-metadata'
;import
from
'./inte***ce'
;import
from
'./constants'
;export
const get =
createdecorator
('get');
export
const post =
createdecorator
('post');
export
const put =
createdecorator
('put');
export
const delete =
createdecorator
('delete');
export
const options =
createdecorator
('options');
export
const patch =
createdecorator
('patch');
// 裝飾器工廠構造器
function
createdecorator
(method: requestmethod)
, key: string, descriptor: propertydescriptor);}
;}
2. 定義controller裝飾器,宣告該類是乙個控制器,用於後面載入路由/// controller.ts
import
'reflect-metadata'
;import
from
'./inte***ce'
;import
from
'./constants'
;export
function
controller
(path ='')
;}
3. 定義乙個注射器,依賴注入的容器// injector.ts
import
'reflect-metadata'
;import
from
'./inte***ce'
;// 乙個單例注射器類
class
injector
// 獲取注射器例項
static
getinstance()
return injector.injector;
}// 新增依賴到注入容器
inject
(target: constructor)
elseif(
!this
.providermap.
has(p))}
this
.providermap.
set(target, target)
;// 依賴放入到容器中
}// 建立乙個例項化工廠,真正的為給定的類注入依賴
factory
(target: constructor)
else
if(item.length)
else})
;return
newtarget
(...dependencies)
;// 把所有的依賴注入的給定的類}}
// 獲取注射器例項並匯出
const rootinjector = injector.
getinstance()
;export
;
4. 定義可被注入類的裝飾器// injectable.ts
import
from
'./injector'
;export
function
injectable()
;}
5. 構建路由,例項化控制器// router.ts
import
'reflect-metadata'
;import
from
'./constants'
;import
*as router from
'koa-router'
;import
from
'./inte***ce'
;import
from
'./utils'
;import
from
'./injector'
;// 初始化路由
export
function
initrouter
(controller: constructor)
= item;
switch
(method)
}return router;
}// 自動載入給定路徑下面,*.controller.ts 檔案下的控制器,繫結路由
export
async
function
autorouter
(rootdir: string)
else})
.filter
(item => item)
;// 遍歷控制器,繫結合併路由
controllerclass.
foreach
(item =>);
}return router;
}// 獲取controller的路由對映
function
maproute
(controller: constructor)`;
// 如果沒有傳遞路徑,預設使用方法名
url = prefix + url;
// 合併路由
return
;// 返回乙個路由對映,bind重新繫結this})
;}
到這裡,所有的邏輯全部實現完畢。
├── src
│ ├── user.controller.ts
│ ├── user.service.ts
│ ├── user.model.ts
│ └── utils.ts
├── package
-lock.json
├── package
.json
├── tsconfig.json
└── tslint.json
// user.controller.ts
@contriller()
export
class
usercontroller
// 注入服務
@get()
async
userinfo
(ctx: context, next:()
=> promise
)= ctx.request.body
const info =
await
this
.userservuce.
getuserinfobyid
(id)
; ctx.body = info;}}
// user.service.ts
@injectable()
export
class
userservice
async
getuserinfobyid
(id: number)
}// user.model.ts
@injectable()
export
class
usermodel
async
findbyid
(id: number));
return user;
}}
**已上傳至github koa-route-decors, 完整的koa專案實現例子huzz-koa-template,也可以看我的另外一篇文章nodejs專案的正確開啟方式,typescript + koa flask的路由配置,特殊裝飾器
1,flask中的路由 2,flask中的例項化配置 class debug object 4,blueprint 5,特殊裝飾器 def af1 response 正常 be1 be2 be3 af3 af2 af1 異常 be1 af3 af2 af1 def error404 args 基於藍...
python裝飾器 AOP的語法糖
python裝飾器是乙個很出名的設計模式,它主要的功能就是不改變函式已有功能的情況下對函式起到乙個錦上添花的作業,使函式的功能更加豐富,在插入日誌,效能測試,快取機制和許可權驗證都是比較好的左右。不同的函式可以使用同乙個裝飾器,所以它和函式本身不存在什麼必然的聯絡。def timeit func d...
mini web之裝飾器方式的新增路由
前面我們已經實現了路由列表,但是每次新增路由都需要手動新增來完成,接下來我們想要完成路由的自動新增,可以通過裝飾器來實現,在使用裝飾器對處理函式進行裝飾的時候我們需要知道裝飾的函式和那個請求路徑進行關聯,也就是說裝飾器需要接收乙個url引數,這樣我們定義的裝飾器是乙個帶有引數的裝飾器。framewo...