使用 NodeJS、Typescript 和 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

posted @ 2022-10-01 09:55  哈哈哈来了啊啊啊  阅读(196)  评论(0编辑  收藏  举报