首页 > 编程语言 >使用 NodeJS、Typescript 和 tsyringe 实现依赖倒置

使用 NodeJS、Typescript 和 tsyringe 实现依赖倒置

时间:2022-10-01 10:13:36浏览次数:117  
标签:存储 Typescript NodeJS 实现 依赖 使用 倒置 tsyringe 注入

使用 NodeJS、Typescript 和 tsyringe 实现依赖倒置

依赖倒置是 5 个 SOLID 原则之一,在我看来,也是最重要的原则之一,因为它允许通过抽象而不是使用具体实现来解耦模块。

记住你 需要使用依赖注入工具来实现依赖倒置原则,尽管像 tsyringe 这样的 DI 库通过将注入委托给外部模块/容器使其更容易。

在我职业生涯的不同时期,我遇到过使用 DI 库的 js/ts 项目,尽管正在注入存储库/服务,但注入是由类名(而不是抽象)提供的。

 container.register(InMemmoryCatsRepository, InMemmoryCatsRepository) ...  
 导出类 GetCatsUseCase 实现 UseCase { @inject(InMemmoryCatsRepository) 私有猫存储库:CatsRepository  
 ...  
 }

注射 ** InMemoryCats 存储库** (一个类)打破了依赖倒置的想法,因为 ** 用例** 层了解实现,因此直接依赖于它。

而不是像以前那样使用一个类,让我们使用一个 令牌 ,它可以是一个类、一个字符串或一个符号。

 输入 InjectionToken<T = any> =  
 |构造函数<T>  
 |延迟构造函数<T>  
 |细绳  
 |象征;

为了证明这一点,我将使用一个手动使用依赖注入的项目并正确实现它 ** 西林** .

应用架构

文件夹架构

从手动注入依赖(通过实例)开始,让我们关注依赖倒置最有意义的部分:在 ** 用例** .

并且依赖关系在 index.ts 中解决

看到这个提交

在这一点上,我们的好处是 ** 用例** 构造函数接收一个接口,这很棒。但是我们可以通过使用依赖注入工具注入依赖来做得更好。

让我们跟着使用 ** 西林** .

我不会展示如何安装和配置 ** 西林** ,因为它在 官方文档 .

让我们首先创建一个容器来注册依赖项 ** src/di/container.ts**

现在所有依赖都注册在一个地方,我们可以根据环境控制和注册每个实例(例如,在测试环境中注入 FakeRepository)

让我们用 ** @injectable** , 并注入存储库 ** @注入。** 存储库还需要注释 ** @可注入。**

看到这个提交 .

虽然上面的代码可以工作,但我们只是创建了一个依赖关系 ** GetCatsUseCase** 和 ** 在MemoryCats 存储库中。** 换句话说,内层(应用程序)依赖于实现细节,即基础层(数据库)。

https://www.dandoescode.com/blog/clean-architecture-an-introduction/

让我们解决这个问题。

首先,我们必须在存储库中附加一个令牌(抽象)。我选择按原样使用符号 不变且独特 .

并且存储库可以注册为单例,因此实例在所有应用程序生命周期之间共享:

而现在,我们的 ** 用例** 不知道(也不需要)具体的存储库实现。

看到这个提交 .

该存储库的实现可以是这样的:

更改存储库数据源非常简单:

  1. 实现一个新的存储库:

2.并注册:

检查这个提交 .

该应用程序以相同的方式工作,但现在我们完全尊重 依赖倒置 原则 ,此外,尊重 开闭原则 因为存储库对扩展开放但对修改关闭。

这个小例子可以在不同的层次上进行扩展,并应用于更重要的项目,从而拥有更多可维护的应用程序。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/40246/53520109

标签:存储,Typescript,NodeJS,实现,依赖,使用,倒置,tsyringe,注入
From: https://www.cnblogs.com/amboke/p/16746836.html

相关文章

  • windows设置pm2开机服务 自启动nodejs项目
    PM2是带有内置负载平衡器的Node.js应用程序的生产过程管理器。可以利用它来简化很多Node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等。安装部署1、我们一......
  • 将 react-beautiful-dnd 与 Next.js 和 TypeScript 一起使用
    将react-beautiful-dnd与Next.js和TypeScript一起使用Next.js+TS+react-beautiful-dnd介绍反应美丽的dnd是专门为列表(垂直、水平、列表之间的移动、嵌套......
  • 带你了解NodeJs的模块系统
    前言在JavaScript语言中,两个独立的js脚本互相引用是无法实现的,只能在Html页面中引入多个脚本来做到关联。NodeJs提供了一个简单的模块系统,它让Js代码之间可以互相引用,方便暴......
  • Vue3 从入门到入土(TypeScript接口)
    前言在上一章,我们就写过简单的接口,本章更深入的了解接口接口是对象的状态(属性)和行为(方法)的抽象(描述)接口以例子来了解,我们有这样的需求定义一个对象存放用......
  • TypeScript一些见解
    1.TypeScript产生背景:  TypeScript是JavaScript的一个超集,支持ECMAScript6标准(ES6教程)。  TypeScript由微软开发的自由和开源的编程语言。TypeSc......
  • nodejs基础
    Node.js目的了解nodejs了解后端读取本地文件连接数据库的响应请求了解api接口文档检测是否有nodenode-v初始化项目切换到项目目录npminit-y使......
  • [Typescript] 41. Medium - IsUnion
    Implementatype IsUnion,whichtakesaninputtype T andreturnswhether T resolvestoauniontype.Forexample:typecase1=IsUnion<string>//false......
  • debian/ubuntu下安装nodejs npm
    wgethttps://nodejs.org/dist/v16.17.1/node-v16.17.1-linux-x64.tar.xz nodejs官网下载地址,目前最新版,以后有更新就换新的地址,wget下来,解压tar-xvfnode-v16.17.1-li......
  • TypeScript学习笔记(四)—— TypeScript提高
    一、类型type1.1、定义Type又叫类型别名(typealias),作用是给一个类型起一个新名字,不仅支持interface定义的对象结构,还支持基本类型、联合类型、交叉类型、元组等任何你需......
  • nodejs stream 背压处理学习
    内容是nodejs官方的,对于需要开发自己的stream是很值得学习参考的参考资料​​https://nodejs.org/en/docs/guides/backpressuring-in-streams/​​​​https://nodejs.org......