使用 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/
让我们解决这个问题。
首先,我们必须在存储库中附加一个令牌(抽象)。我选择按原样使用符号 不变且独特 .
并且存储库可以注册为单例,因此实例在所有应用程序生命周期之间共享:
而现在,我们的 ** 用例** 不知道(也不需要)具体的存储库实现。
看到这个提交 .
该存储库的实现可以是这样的:
更改存储库数据源非常简单:
- 实现一个新的存储库:
2.并注册:
检查这个提交 .
该应用程序以相同的方式工作,但现在我们完全尊重 依赖倒置 原则 ,此外,尊重 开闭原则 因为存储库对扩展开放但对修改关闭。
这个小例子可以在不同的层次上进行扩展,并应用于更重要的项目,从而拥有更多可维护的应用程序。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明