最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何為Vue3提供一個(gè)可媲美Angular的ioc容器

 更新時(shí)間:2024年08月02日 10:05:50   作者:濮水大叔  
ue3因其出色的響應(yīng)式系統(tǒng),以及便利的功能特性,完全勝任大型業(yè)務(wù)系統(tǒng)的開發(fā),這篇文章主要介紹了如何為Vue3提供一個(gè)可媲美Angular的ioc容器,需要的朋友可以參考下

為什么要為Vue3提供ioc容器

Vue3因其出色的響應(yīng)式系統(tǒng),以及便利的功能特性,完全勝任大型業(yè)務(wù)系統(tǒng)的開發(fā)。但是,我們不僅要能做到,而且要做得更好。大型業(yè)務(wù)系統(tǒng)的關(guān)鍵就是解耦合,從而減緩shi山代碼的生長(zhǎng)。而ioc容器是目前最好的解耦合工具。Angular從一開始就引入了ioc容器,因此在業(yè)務(wù)工程化方面一直處于領(lǐng)先地位,并且一直在向其他前端框架招手:“我在前面等你們,希望三年后能再見”。那么,我就試著向前走兩步,在Vue3中引入ioc容器,并以此為基礎(chǔ)擴(kuò)充其他工程能力,得到一個(gè)新框架:Zova。諸君覺得是否好用,歡迎拍磚、交流:

IOC容器分類

在 Zova 中有兩類 ioc 容器:

  • 全局ioc容器:在系統(tǒng)初始化時(shí),會(huì)自動(dòng)創(chuàng)建唯一一個(gè)全局 ioc 容器。在這個(gè)容器中創(chuàng)建的Bean實(shí)例都是單例模式
  • 組件實(shí)例ioc容器:在創(chuàng)建 Vue 組件實(shí)例時(shí),系統(tǒng)會(huì)為每一個(gè) Vue 組件實(shí)例創(chuàng)建一個(gè) ioc 容器。在這個(gè)容器中創(chuàng)建的Bean實(shí)例可以在組件實(shí)例范圍之內(nèi)共享數(shù)據(jù)和邏輯

Bean Class分類

Zova 采用模塊化體系,Bean Class 都由不同的模塊提供。使用模塊內(nèi)部的 Bean Class 時(shí)可以直接基于Class類型定位。在跨模塊使用時(shí)可以基于Bean標(biāo)識(shí)定位,而不是基于Class類型/文件路徑定位,這樣有利于實(shí)現(xiàn)模塊之間的松耦合

因此,Zova 提供了兩類 Bean Class:

  • 匿名bean:使用@Local裝飾的 class 就是匿名bean。此類 bean 僅在模塊內(nèi)部使用,不存在命名沖突的問題,定義和使用都很便捷
  • 具名bean:除了@Local之外,其他裝飾器函數(shù)裝飾的 class 都是具名bean。Zova 為此類 bean 提供了命名規(guī)范,既可以避免命名沖突,也有利于跨模塊使用

注入機(jī)制

Zova 通過@Use裝飾器函數(shù)注入 Bean 實(shí)例,提供了以下幾種注入機(jī)制:

1. Bean Class

通過Bean Class在 ioc 容器中查找并注入 Bean 實(shí)例,如果不存在則自動(dòng)創(chuàng)建。這種機(jī)制一般用于同模塊注入

import { ModelTodo } from '../../bean/model.todo.js';
class ControllerTodo {
  @Use()
  $$modelTodo: ModelTodo;
}

2. Bean標(biāo)識(shí)

通過Bean標(biāo)識(shí)在 ioc 容器中查找并注入 Bean 實(shí)例,如果不存在則自動(dòng)創(chuàng)建。這種機(jī)制一般用于跨模塊注入層級(jí)注入

import type { ModelTabs } from 'zova-module-a-tabs';
class ControllerLayout {
  @Use('a-tabs.model.tabs')
  $$modelTabs: ModelTabs;
}
  • 通過a-tabs.model.tabs查找并注入 Bean 實(shí)例
  • 因此,只需導(dǎo)入 ModelTabs 的 type 類型,從而保持模塊之間的松耦合關(guān)系

3. 注冊(cè)名

通過注冊(cè)名在 ioc 容器中查找并注入 Bean 實(shí)例,如果不存在則返回空值。這種機(jī)制一般用于同模塊注入層級(jí)注入

import type { ModelTodo } from '../../bean/model.todo.js';
class ControllerTodo {
  @Use({ name: '$$modelTodo' })
  $$modelTodo: ModelTodo;
}
  • 通過注冊(cè)名$$modelTodo查找并注入 Bean 實(shí)例。一般而言,應(yīng)該確保在 ioc 容器中已經(jīng)事先注入過 Bean 實(shí)例,否則就會(huì)返回空值

4. 變量名

通過變量名在 ioc 容器中查找并注入 Bean 實(shí)例,如果不存在則返回空值。這種機(jī)制一般用于同模塊注入層級(jí)注入

import type { ModelTodo } from '../../bean/model.todo.js';
class ControllerTodo {
  @Use()
  $$modelTodo: ModelTodo;
}
  • 通過變量名$$modelTodo查找并注入 Bean 實(shí)例。一般而言,應(yīng)該確保在 ioc 容器中已經(jīng)事先注入過 Bean 實(shí)例,否則就會(huì)返回空值

注入范圍

匿名bean的默認(rèn)注入范圍都是ctx,具名bean可以在定義時(shí)指定默認(rèn)注入范圍,不同的場(chǎng)景(scene)有不同的默認(rèn)注入范圍。 此外,在實(shí)際注入時(shí),還可以在@Use 中通過injectionScope選項(xiàng)覆蓋默認(rèn)的注入范圍

Zova 提供了以下幾種注入范圍:app/ctx/new/host/skipSelf

1. app

如果注入范圍是 app,那么就在全局 ioc 容器中注入 bean 實(shí)例,從而實(shí)現(xiàn)單例的效果

// in module: test-module1
@Store()
class StoreCounter {}
// in module: test-module2
import type { StoreCounter } from 'zova-module-test-module1';
class Test {
  @Use('test-module1.store.counter')
  $$storeCounter: StoreCounter;
}
  • Store 的注入范圍默認(rèn)是 app,因此通過 Bean 標(biāo)識(shí)test-module1.store.counter在全局 ioc 容器中查找并注入 bean 實(shí)例

2. ctx

如果注入范圍是 ctx,那么就在當(dāng)前組件實(shí)例的 ioc 容器中注入 bean 實(shí)例

// in module: a-tabs
@Model()
class ModelTabs {}
// in module: test-module2
import type { ModelTabs } from 'zova-module-a-tabs';
class ControllerLayout {
  @Use('a-tabs.model.tabs')
  $$modelTabs: ModelTabs;
}
  • Model 的注入范圍默認(rèn)是 ctx,因此通過 Bean 標(biāo)識(shí)a-tabs.model.tabs在當(dāng)前組件實(shí)例的 ioc 容器中查找并注入 bean 實(shí)例

3. new

如果注入范圍是 new,那么就直接創(chuàng)建新的 bean 實(shí)例

// in module: a-tabs
@Model()
class ModelTabs {}
// in module: test-module2
import type { ModelTabs } from 'zova-module-a-tabs';
class ControllerLayout {
  @Use({ beanFullName: 'a-tabs.model.tabs', injectionScope: 'new' })
  $$modelTabs: ModelTabs;
}
  • 由于指定 injectionScope 選項(xiàng)為 new,因此通過 Bean 標(biāo)識(shí)a-tabs.model.tabs直接創(chuàng)建新的 bean 實(shí)例

層級(jí)注入

注入范圍除了支持app/ctx/new,還支持層級(jí)注入:host/skipSelf

4. host

如果注入范圍是 host,那么就在當(dāng)前組件實(shí)例的 ioc 容器以及所有父容器中依次查找并注入 bean 實(shí)例,如果不存在則返回空值

// in parent component
import type { ModelTabs } from 'zova-module-a-tabs';
class Parent {
  @Use('a-tabs.model.tabs')
  $$modelTabs: ModelTabs;
}
// in child component
import type { ModelTabs } from 'zova-module-a-tabs';
class Child {
  @Use({ injectionScope: 'host' })
  $$modelTabs: ModelTabs;
}
  • 由于父組件已經(jīng)注入了 ModelTabs 的 bean 實(shí)例,因此子組件可以直接查找并注入
  • 層級(jí)注入同樣支持所有注入機(jī)制:Bean Class/Bean標(biāo)識(shí)/注冊(cè)名/變量名

5. skipSelf

如果注入范圍是 skipSelf,那么就在所有父容器中依次查找并注入 bean 實(shí)例,如果不存在則返回空值

Zova已開源:https://github.com/cabloy/zova

到此這篇關(guān)于如何為Vue3提供一個(gè)可媲美Angular的ioc容器的文章就介紹到這了,更多相關(guān)Vue3 ioc容器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue3.0中setup中異步轉(zhuǎn)同步的實(shí)現(xiàn)

    vue3.0中setup中異步轉(zhuǎn)同步的實(shí)現(xiàn)

    這篇文章主要介紹了vue3.0中setup中異步轉(zhuǎn)同步的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 前端vue數(shù)組去重的三種方法代碼實(shí)例

    前端vue數(shù)組去重的三種方法代碼實(shí)例

    數(shù)組去重是我面試時(shí)候經(jīng)常會(huì)問到應(yīng)聘者的一個(gè)問題,所以下面這篇文章主要給大家介紹了關(guān)于前端vue數(shù)組去重的三種方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • Vue中SSR的作用是什么

    Vue中SSR的作用是什么

    這篇文章主要介紹了Vue中SSR的作用及使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • vue如何實(shí)現(xiàn)清空this.$route.query的值

    vue如何實(shí)現(xiàn)清空this.$route.query的值

    這篇文章主要介紹了vue如何實(shí)現(xiàn)清空this.$route.query的值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Vue3中v-model實(shí)現(xiàn)雙向數(shù)據(jù)綁定的全面指南

    Vue3中v-model實(shí)現(xiàn)雙向數(shù)據(jù)綁定的全面指南

    在Vue開發(fā)中,v-model是實(shí)現(xiàn)表單輸入和應(yīng)用狀態(tài)之間雙向綁定的關(guān)鍵指令,Vue 3對(duì)v-model進(jìn)行了重大改進(jìn),使其更加靈活和強(qiáng)大,本文將深入探討 Vue 3中v-model的工作原理、新特性以及最佳實(shí)踐,需要的朋友可以參考下
    2025-07-07
  • vue實(shí)現(xiàn)動(dòng)態(tài)按鈕功能

    vue實(shí)現(xiàn)動(dòng)態(tài)按鈕功能

    這篇文章主要介紹了vue實(shí)現(xiàn)動(dòng)態(tài)按鈕功能,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-05-05
  • 八種vue實(shí)現(xiàn)組建通信的方式

    八種vue實(shí)現(xiàn)組建通信的方式

    這篇文章主要介紹是八種vue實(shí)現(xiàn)組建通信的方式,包括、props 父組件與子組件通信、$emit 子組件父組件傳遞、$emit與props結(jié)合 兄弟組件傳值等等,想具體了解的朋友可以參考下面文章的具體內(nèi)容
    2021-09-09
  • Vue+ ArcGIS JavaScript APi詳解

    Vue+ ArcGIS JavaScript APi詳解

    這篇文章主要介紹了Vue+ ArcGIS JavaScript APi,文中需要注意ArcGIS JavaScript3.x 和ArcGIS JavaScript 4.x框架差異較大,本文從環(huán)境搭建開始到測(cè)試運(yùn)行給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • vue中form表單禁用專用組件介紹

    vue中form表單禁用專用組件介紹

    這篇文章主要介紹了vue中form表單禁用專用組件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 深入了解Vue動(dòng)態(tài)組件和異步組件

    深入了解Vue動(dòng)態(tài)組件和異步組件

    這篇文章主要介紹了深入了解Vue動(dòng)態(tài)組件和異步組件的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)vue組件的相關(guān)知識(shí),感興趣的朋友可以了解下
    2021-01-01

最新評(píng)論

澳门| 广平县| 修武县| 广饶县| 化隆| 龙井市| 乡宁县| 尚志市| 甘孜县| 林周县| 永德县| 宾阳县| 天等县| 田东县| 浦县| 沐川县| 江山市| 宝丰县| 宁津县| 镇赉县| 凤翔县| 石渠县| 宁化县| 高雄县| 松滋市| 巴彦淖尔市| 卓资县| 贵南县| 瑞丽市| 宁武县| 建始县| 香格里拉县| 和平县| 黑河市| 郧西县| 榆林市| 多伦县| 泰宁县| 许昌县| 施秉县| 娄烦县|