在现代Web开发中,React.js 已经成为构建用户界面的流行选择之一。然而,随着应用的增长,管理组件之间的依赖关系变得越来越复杂。依赖注入(DI)和控制反转(IOC)是解决这一问题的有效方法。本文将介绍如何在React项目中使用InversifyJS实现DI和IOC。
依赖注入是一种设计模式,其中一个对象提供另一个对象的依赖项。依赖项是可以使用的对象(服务)。注入是将依赖项传递给依赖对象(客户端)的过程。服务成为客户端状态的一部分。与允许客户端构建或查找服务相比,将服务传递给客户端是模式的基本要求。
依赖注入背后的意图是解耦对象,以至于如果客户端依赖的对象需要更改为不同的对象,客户端代码不需要更改。依赖注入是更广泛的控制反转技术的一种形式。与传统的程序控制模式不同,高级代码可以接收低级代码,然后调用它。
在React中实现DI/IOC有几种选择,包括:
每种方法都有其优缺点。例如,React上下文是一种简单直接的方式,但可能不适合大型应用。模块系统提供了更多的灵活性,但可能需要更多的配置。第三方DI/IOC系统,如InversifyJS,提供了更完整的功能和更好的类型支持。
选择了InversifyJS作为DI/IOC库,原因如下:
基于这些原因,选择了InversifyJS。接下来,来看看如何在项目中使用它。
首先,需要确保有正确的Node包。可以通过以下NPM命令来实现:
npm install inversify reflect-metadata --save
安装完成后,package.json文件中应该包含以下条目:
InversifyJS需要一些特定的TypeScript设置。这些设置需要放在tsconfig.json文件中。以下是自上次以来的新行:
让从创建可以注入其他值的类开始,并可以从容器中解析。
在InversifyJS中,一个类型必须被标记为@Injectable,这是其他DI/IOC提供者不需要的。这很可能是因为JavaScript是一种动态语言,这些装饰器用于创建额外的元数据,以便于所有IOC容器使用的解析机制。
要将某个东西注入类中,需要使用@Inject装饰器。以下是一个可以从InversifyJS IOC容器中解析的类的示例,并且它的构造函数依赖项也会被InversifyJS IOC容器解析。
选择为容器创建一个单例对象,如下所示:
在上述代码中,导入了reflect-metadata、Container和TYPES。有一个单例,它简单地包装了InversifyJS IOC容器。配置了容器注册(InversifyJS中的绑定)。
由于使用的是React,可能会使用InversifyJS IOC容器来帮助创建React组件的props。这与本讨论无关,所以让看看如何使用InversifyJS解析Foo IOC注册类的实例。
必须承认,在项目中启动InversifyJS时遇到了一些困难。但也要说,在Inversify论坛上提了一个问题,作者Remo Jansen非常出色地帮助运行东西。以至于把他指向GitHub仓库,他看了看,让它工作,并给发了一个拉取请求。
Remo,向致敬,顶级库,顶级家伙。正如承诺的,欠一杯啤酒。