依赖注入(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();
}
}

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

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

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

2024-08-05

突然想到一个问题,我这里所有的服务都不是单例,这样多个类注入的时候会产生多个实例,不是很好,那我来优化下,让他们注入的都是同一个对象就好了

首先将@injectable装饰器进行修改

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

然后,修改@inject装饰器

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

这样,多个类注入的服务就是同一个实例了,Nice

TS中简单实现一下依赖注入的更多相关文章

  1. ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC中使用Unity进行依赖注入的三种方式 2013-12-15 21:07 by 小白哥哥, 146 阅读, 0 评论, 收藏, 编辑 在ASP.NET MVC4中,为了在解开C ...

  2. 我在项目中运用 IOC(依赖注入)--实战篇

    上一篇<我在项目中运用 IOC(依赖注入)--入门篇>只是简单的使用 IOC.实际项目使用 IOC 的情景复杂多了,比如说,构造函数有多个参数,有多个类继承同一个接口... Unity都有 ...

  3. 在 mvc 4 中使用 unity 进行依赖注入

    在 mvc 4 中使用 unity 进行依赖注入 关于依赖注入的概念,这里就不再叙述了,我们用 mvc 4 结合 unity,使用构造函数来进行依 赖注入.具体步骤如下: 1. 首先建立 一个 mvc ...

  4. 在ASP.NET MVC中使用Unity进行依赖注入的三种方式

    在ASP.NET MVC4中,为了在解开Controller和Model的耦合,我们通常需要在Controller激活系统中引入IoC,用于处理用户请求的 Controller,让Controller ...

  5. 细数Javascript技术栈中的四种依赖注入

    作为面向对象编程中实现控制反转(Inversion of Control,下文称IoC)最常见的技术手段之一,依赖注入(Dependency Injection,下文称DI)可谓在OOP编程中大行其道 ...

  6. AngularJS学习--- AngularJS中XHR(AJAX)和依赖注入(DI) step5

    前言:本文接前一篇文章,主要介绍什么是XHR,AJAX,DI,angularjs中如何使用XHR和DI. 1.切换工具目录 git checkout -f step- #切换分支 npm start ...

  7. laravel框架中所用到的依赖注入

    用Laravel开发前前后后有2个月左右了,之前一直写Java,就像找到Java和PHP之前的共同点,用Java的某些原理去理解PHP会发现还是有很多共通之处的.Java的依赖注入已经是一个很常见的概 ...

  8. .net core程序中使用微软的依赖注入框架

    我之前在博文中介绍过Asp.net core下系统自带的依赖注入框架,这个依赖框架在Microsoft.Extensions.DependencyInjection中实现,本身并不是.net core ...

  9. ASP.NET Core 中的框架级依赖注入

    https://tech.io/playgrounds/5040/framework-level-dependency-injection-with-asp-net-core 作者: Gunnar P ...

  10. 我在项目中运用 IOC(依赖注入)--入门篇

    之前就听同事说过依赖注入(dependency injection).控制反转(Inversion of Control).起初听的是一头雾水,试着在项目中运用了几次,总算明白了一些,抛砖引玉,与大家 ...

随机推荐

  1. react-devtools安装以及使用中的问题

    使用react框架开发的小伙伴肯定都想使用想vue-devtools开发工具一样,可以看见组件的状态,和当前组件里的props,data等等. 当然react也有一个开发者工具,现在废话少说,开始安装 ...

  2. js 异步 任务 题目解析(chatgpt bug了?)

    最近遇到一道题如下,求输出结果 感觉还是蛮有意思的,找chatgpt做了一下 我是题 async function async1(){ console.log('1'); await async2() ...

  3. .NET开源、简单、实用的数据库文档生成工具

    前言 今天大姚给大家分享一款.NET开源(MIT License).免费.简单.实用的数据库文档(字典)生成工具,该工具支持CHM.Word.Excel.PDF.Html.XML.Markdown等多 ...

  4. [oeasy]python0132_变量含义_meaning_声明_declaration_赋值_assignment

    变量定义 回忆上次内容 上次回顾了一下历史 python 是如何从无到有的 看到 Guido 长期的坚持和努力   编程语言的基础都是变量声明 python是如何声明变量的呢?   变量 想要定义变量 ...

  5. 如何在 Vue 和 JavaScript 中截取视频任意帧图片

    如何在 Vue 和 JavaScript 中截取视频任意帧图片 大家好!今天我们来聊聊如何在 Vue 和 JavaScript 中截取视频的任意一帧图片.这个功能在很多场景下都非常有用,比如视频编辑. ...

  6. RHCA rh442 002 监控工具 脏页 块设备名 缓存

    sar 看某一个时间的数据 sar -d 1 5 与iostat类似 计算机识别设备按编号识别 0-15预留出 8 为iscsi设备 做一个块设备名 名字不重要是给人看的,重要的是编号 8 17(主编 ...

  7. python raise异常处理

    python raise异常处理 一般最简单的异常处理是try  except: try: f = open('test.txt') except Exception as e: print(e) f ...

  8. Jmeter循环指定接口并接收不同参数值

    背景:在做接口自动化流程中我们会遇到需要提取上个接口的返回值作为下个接口的传参,在提取值数量不固定的情况下,如何在一个线程让指定接收参数的接口自动循环完所有的传参呢? 解决:添加[循环控制器]指定循环 ...

  9. MapGIS路网数据发布

    准备 1.MapGIS 10 桌面版(我用的10.5.6.10) 2.路网的shp文件 数据导入 1.创建要素集,如果已有要素集可以不用创建: 2.导入路网要素类,选择准备好的shp文件后导入即可: ...

  10. 【Mybatis】05 官方文档指北阅读 vol3 配置 其二

    对象工厂(objectFactory)[省略,入门阶段实在不懂] 插件(plugins)[省略,入门阶段实在不懂] 环境配置(environments) MyBatis 可以配置成适应多种环境,这种机 ...