91精产品自偷自偷综合官网版下载-91精产品自偷自偷综合下-91精品-91精品91久久久-91精品成人-91精品成人www

網站建設資訊

NEWS

網站建設資訊

typescriptnodejs依賴注入的實現

typescript nodejs 依賴注入的實現?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

10年積累的成都網站設計、網站建設經驗,可以快速應對客戶對網站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網絡服務。我雖然不認識你,你也不認識我。但先網站設計后付款的網站建設流程,更有永寧免費網站建設讓你可以放心的選擇與我們合作。

import "reflect-metadata";
/**
 * 對象管理器
 */
const _partialContainer = new Map();
const PARAMTYPES = "design:paramtypes";//需要反射的原數據,有很多種選擇,我們這里選擇的是拿到構造函數的參數類型,為了后續判斷
/**
 * 局部注入器,注入的是全局服務,實例是全局共享
 */
export function Inject(): ClassDecorator {
  return target => {
    const params: Array = Reflect.getMetadata(PARAMTYPES, target);
    if (params)
      for (const item of params) {
        if (item === target) throw new Error("不能注入自己");
      }
    _partialContainer.set(target.name, target);//加入到對象管理器中,這個時候對象還沒有被創建
  }
}

  上面的代碼是創建一個類級別的裝飾器,表示凡是使用了這個裝飾器的類都會被依賴注入對象管理器管理,這里沒有馬上創建服務,原因是reflect-metadata的執行有先機是最高的,而這個依賴注入是支持手動注入一些實例對象,所有為了防止出現注入參數為undefined所以創建實例的工作是放在后面的,請看接下來的代碼:

/**
 *
 * @param type 已創建的實例對象
 */
export function addServiceInGlobal(...types: Array) {
  for (const iterator of types) {
    _partialContainer.set(iterator.constructor.name, iterator);
  }
}

上面的方法是手動注入實例對象時調用的,我們需要提高這個方法的執行優先級,具體的實例會在后面演示,接下來是最重要部分,創建實例部分:

export function serviceProvider(service: ServiceType): T {
  if (_partialContainer.has(service.name) && !_partialContainer.get(service.name).name)
    return _partialContainer.get(service.name);// 如果實例已經被創建就直接返回
 
  const params: Array = Reflect.getMetadata(PARAMTYPES, service);// 反射拿到構造函數的參數類型
  const constrparams = params.map(item => { // 實例化參數中的依賴
    if (!_partialContainer.has(item.name)) throw new Error(`${item}沒有被注入`);// 如果沒有注入就拋出異常
    if (item.length)// 表示這個類型還有其它依賴
      return serviceProvider(item);// 遞歸繼續獲取其他依賴
    if (_partialContainer.has(item.name) && !_partialContainer.get(item.name).name)
      return _partialContainer.get(item.name);// 如果實例已經被創建就直接返回
    const obj = new item();// 已經沒有其他依賴了 開始創建實例
    _partialContainer.set(item.name, obj);// 替換對象管理器中原來沒有實例化的對象
    return obj;
  });
  const obj = new service(...constrparams); // 這里表示對象沒有被創建,開始創建對象
  _partialContainer.set(service.name, obj);// 替換對象管理器中原來沒有實例化的對象
  return obj;
}

上面代碼寫的稍微有一點點復雜,其他理解起來也不困難,大白話講就是 如果已經實例化了直接返回實例不然就開始對象以及創建出所有的依賴。接下來是例子:

import { serviceProvider, addServiceInGlobal, Inject } from './core/injectable/injector';
import "reflect-metadata";
import moment = require('moment');
@Inject()
export class ServiceA{
  property?:string;
  msg(){
    return "ServiceA";
  }
}
@Inject()
export class ServiceC {
  constructor(private service: ServiceA) { }
  print() {
   console.log( this.service.property);
    return "調用了我";
  }
}
@Inject()
export class ServiceD{
  print(){
   console.log("我在測試注入");
  }
}
@Inject()
export class GlobalService {
  constructor(private service: ServiceC) { }
  msg!: string;
  print() {
    console.log(`共享模塊${this.service.print()}`)
  }
}
@Inject()
export class Init {
  constructor(private service: ServiceA,
    private serviceD: ServiceD,
    private global: GlobalService,
    private date: Date,
    private strList: string[],
    private serviceC: ServiceC,
  ) { }
  start() {
    console.log(this.service.msg());
    this.service.property = "A模塊設置的共享數據"
    console.log(moment(this.date).format("YYYY-MM-DD"))
    console.log(this.strList);
    this.serviceD.print();
    this.serviceC.print();
    this.global.print();
  }
}
 
const obj = new Date("2017-1-1");
const str = ['呂順彬','菜鳥','豆豆','大鐵','CC哥','碼農之家的一群人'];
addServiceInGlobal(obj, str); // 添加手動創建的實例對象到對象管理器
const service = serviceProvider(Init); // 開始創建實例
service.start()// 執行

上面的實例中得到一下執行結果:

typescript nodejs 依賴注入的實現

看完上述內容,你們掌握typescript nodejs 依賴注入的實現的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創新互聯行業資訊頻道,感謝各位的閱讀!


網站標題:typescriptnodejs依賴注入的實現
瀏覽地址:http://www.yuzhuanjia.cn/article/gshpcp.html 主站蜘蛛池模板: 一区二区三区视频 | 国产69精品久 | 果冻传媒董小宛视频一区 | 粗大的内捧猛烈进出在线视频 | 91精品专区| 91麻豆精品人妻无码系列 | 午夜精品国产欧美日韩久 | 不卡中文字幕在线观看 | GAY空少被体育生开菊网站 | 99久久99久久精品国产片黑人巨大精品欧美一区二区免费 | 福利视频在线播放 | 久久国产精品久 | 午夜在线观看亚 | 午夜小视频试看五分钟 | 国产爆乳无码视频在线观看3 | www国产无套 | 91av视频在线播放 | 国产91精品高清一区二区三区 | 国产91欧美一区二区精品 | 91国内精品久久久久毛片精华液 | 韩国三级香港三级日本三级 | 国产v国产v片大片线观看网站 | 成人bv在线观看 | 91在线国产手机在线 | va亚洲va日韩不卡在线观看 | 91天堂| 一区国产视频页 | 91精品国产综合久久婷婷香蕉 | 白丝爆乳jk自慰流水网站 | 91网站免费在线观看 | 91久久精品日日躁夜夜躁欧美 | 91精品久久人人妻人人做 | www精品一区二区三区四区 | 国产suv精二区 | 午夜福利久久 | 粗大的内捧猛烈进出 | 午夜福利| 高清精品亚洲日韩 | 国产aⅴ一二三区无码视频 国产aⅴ一区 | 韩国三级在线中文字幕无码 | 91桃色app |