首页 > 其他分享 >TS中简单实现一下依赖注入

TS中简单实现一下依赖注入

时间:2024-08-02 14:50:12浏览次数:14  
标签:依赖 target TS className MapServices services 注入

依赖注入(Dependency Injection,DI)是一种设计模式,主要用于实现控制反转(Inversion of Control,IoC)。它通过将对象的依赖关系从内部管理转移到外部容器来解耦组件,从而提高代码的可测试性、可维护性和灵活性。

之前在使用nest.js中做开发的时候,被这种模式的简单性吸引,今天自己来使用TS简单实现一下依赖注入的能力。

首先在tsconfig.json中开启装饰器能力

 "experimentalDecorators": true

然后我需要提供一个装饰器,来标识这个类是提供服务的类,也就是说可以被注入的类,代码如下

type Services = { [key: string]: any };
const services: Services = new Map();

function injectable(target: any) {
  services.set(target.name, target);
}

我定义了一个map来存放这些可以注入的类,然后我们使用一下这个装饰器

@injectable
class MapServices {
    getLocation() {
        console.log("返回当前用户的经纬度...");
    }
}

OK,接下来,我们定义加载装饰器,用来加载这些提供依赖的服务

function inject(className: string) {
    return function (target: any, propertyKey: string) {
        if (services.get(className)) {
            target[propertyKey] = new (services.get(className))();
        } else throw new ReferenceError(`${className}的依赖无法找到!`);
    };
}

然后,我们使用这个装饰器来将提供地图服务的依赖加载进来

class UserController {
    @inject("MapServices") mapServices?: MapServices;
    getUserLocation() {
        this.mapServices!.getLocation();
    }
}

最后让我们来实验一下效果

 至此,一个简单的依赖注入模式就实现了

标签:依赖,target,TS,className,MapServices,services,注入
From: https://www.cnblogs.com/aursordev/p/18338738

相关文章

  • Bug 解决 | 后端项目无法正常启动,或依赖服务连接失败
    目录1、版本问题2、依赖项问题明明拷贝的代码,为什么别人行,我启动就报错?这篇文章我就理一下最最常见的项目启动报错的两种原因!1、版本问题比如明明项目的Java版本是8,你非得拿5跑?那不是完犊子了吗?比如报错:java:-source1.5 中不支持diamond运算符。再比如拿高......
  • 给echarts图表线条、数据点和区域设置颜色
    letmyChart=echarts.init(document.getElementById("chartmainCop"));//获取当前干部的各项评分constallIndicators=Object.keys(this.dialogEacherTable[0]).filter(key=>key!=="CadreID"&&key!=="x......
  • python3之语音合成pyttsx3库使用
    pyttsx3pyttsx3是一个Python库,‌用于将文本转换为语音输出。‌它支持多种操作系统,‌包括Windows和macOS,‌并且提供了丰富的功能来控制文本到语音的转换过程。‌importpyttsx3msg="HelloWorld!"pyttsx3.speak(msg)engine=pyttsx3.init()engine.say(msg)engine.run......
  • 创建xtrbackup备份用户 ERROR 1819 (HY000): Your password does not satisfy the cur
    查看密码策略mysql>SHOWVARIABLESLIKE'validate_password%';+--------------------------------------+--------+|Variable_name|Value|+--------------------------------------+--------+|validate_password_check_user_name......
  • 将 cookie 数据添加到 requests.urlretrieve 中
    我正在尝试从受密码保护的网站下载.torrent文件。我已经成功地使用cookie访问该网站,如下所示:cookies={'uid':'232323','pass':'31321231jh12j3hj213hj213hk','__cfduid':'kj123kj21kj31k23jkl21j321j3kl213kl21j3'}......
  • JVM—垃圾收集算法和HotSpot算法实现细节
    1、分代回收策略分代的垃圾回收策略,是基于这样一个事实:不同的对象的生命周期是不一样的。因此,不同生命周期的对象可以采取不同的收集方式,以便提高回收效率。分代垃圾回收采用分治的思想,进行代的划分,把不同生命周期放在不同代上,不同代采用最适合它的垃圾回收方法进行回收。......
  • CodeForces 1132B Discounts
    题目链接:CodeForces1132B【Discounts】思路    因为使用coupons购买q[i]块巧克力,不需要付最便宜的那块巧克力的钱,所以为了使得优惠最大化,所以可以在使用优惠券的时候购买最贵的p[i]块巧克力,所以计算所有巧克力价格高之和和排序后很快能得到答案。代码#include<cst......
  • 利用Echarts构建词云
    使用第三方库echarts-wordcloud,该库在echarts的基础上,实现词云的构建安装npmiechartsnpmiecharts-wordcloud按需引入import*asechartsfrom'echarts';import'echarts-wordcloud';基本配置{series:[{type:'wordCloud',//字体大小范围12p......
  • 代码审计: ThinkPHP V6.0.12LTS反序列化漏洞复现
    这里写目录标题源码下载一、前缀知识事件回调:二、代码审计查找反序列化路由三、利用链分析构造exp源码下载在我的个人免费资源里面一、前缀知识事件回调:概念:在某个特定事件发生时,系统会调用预先定义好的函数(即回调函数)来处理该事件。回调函数通常作为参数传递给......
  • 封装Echarts组件
    构建配置文件,按需引入相关组件//echarts.config.js//*需要哪些组件和配置,请在import时手动添加。import*asechartsfrom'echarts/core';//引入用到的图表import{BarChart,PieChart}from'echarts/charts';//引入提示框、数据集等组件import{DataZoomCo......