简介
di-con 是一个轻量级的依赖注入容器,适用于前端和后端 JavaScript 应用程序。采用 di-con 可以避免手动管理依赖项,减少代码耦合,提高代码复用性和可读性。
安装
可以通过 NPM 安装 di-con:
npm install --save di-con
使用方法
首先需要创建一个容器实例:
import { Container } from 'di-con'; const container = new Container();
然后就可以使用 register
方法将所需的依赖项注册到容器中。该方法接收两个参数:依赖项的名称和实现。
container.register('userRepository', UserRepository);
对于类,它会自动创建一个新实例。对于函数,则返回该函数的结果。
有时候我们需要手动传入一个参数来实例化该类,可以使用 registerFactory
方法:
container.registerFactory('userRepository', ({ db }) => new UserRepository(db));
以上代码中,({ db })
是一个解构参数,使得传入的参数可以通过名称直接访问。这个例子中,容器不会直接实例化 UserRepository
,而是需要传入 db
对象来实例化。
随后,我们可以使用 resolve
方法从容器中获取依赖项的实例:
const userRepository = container.resolve('userRepository');
这将返回在容器中注册的名称为 userRepository
的实现。如果这个依赖项存在其他依赖项,它们也将递归地从容器中解决。
嵌套容器
有时候,我们需要在某些特定的地方为依赖项创建新的实例,而不是直接使用容器中的单例实例。这时候,我们可以使用嵌套容器来创建新实例。
const childContainer = container.createChild(); const specialService = { name: 'SpecialService' }; childContainer.registerInstance('specialService', specialService); const userRepository = childContainer.resolve('userRepository');
在上面的示例中,我们创建了一个名为 specialService
的实例,使用 createChild()
方法创建了一个名为 childContainer
的子容器,然后将 specialService
注册到 childContainer
中,最后解决 userRepository
的依赖关系。在这个过程中,childContainer
不会影响父容器。它只是保存了一个单独的依赖项。
类型注入
有时候,我们需要将类本身注册到容器中,而不是从容器中解决实例。这时,我们可以使用 registerType
方法。
container.registerType(UserService);
以上代码中的 UserService
是一个类。当我们需要创建这个类的实例时,可以使用 resolve
方法:
const userServiceClass = container.resolve(UserService);
注意,在这里我们没有传递名称参数,而是传递了一个类参数。
示例
以下是将 di-con 应用于 Express.js 应用程序的示例。
用户存储库 User Repository:
-- -------------------- ---- ------- ----- -------------- - ------------- -- -- - ------- - --- - --------------- - ------ --------------------- - ---- ----- ----- -- - -------- - -
用户服务 User Service:
-- -------------------- ---- ------- ----- ----------- - ------------- -------------- -- - ------------------- - --------------- - ----- --------------- - ----- ---- - ----- ------------------------------------ ------ - --- -------- ----- ---------- ------ ----------- -- - -
Express.js 控制器 Controller:
-- -------------------- ---- ------- ----- -------------- - ------------- ----------- -- - ---------------- - ------------ - ----- ------------ ---- - ----- - -- - - ----------- ----- ---- - ----- --------------------------------- --------------- - -
最后,将这些依赖项注册到容器中:
-- -------------------- ---- ------- ----- --------- - --- ------------ -- -------- ------------ ------------------------ ---- ------------------------------------------- -- -- -- -- --- ---------------- -- ---- ---------------------------------------- -- -------------- -- -- --- ------------- -------------- ---- ------------------------------------------- -- ----------- -- -- --- ---------------- ----------- ---- -- ------- ---------- ----- -------------- - ------------------------------------
通过遵循这些步骤,我们成功创建了一个可维护的、松散耦合的 Express.js 控制器,它通过 di-con 处理了所有的依赖项。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055b5881e8991b448d8e43