Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@searchfe/inject-js

Package Overview
Dependencies
Maintainers
16
Versions
19
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@searchfe/inject-js

A Dependency Injection library

  • 1.6.4
  • latest
  • Source
  • npm
  • Socket score

Version published
Maintainers
16
Created
Source

inject-js

Build Status semantic-release Coveralls

一个极简的 TypeScript 依赖注入框架。https://searchfe.github.io/inject-js/

  • English

安装

使用 npm 来安装:

npm install --save @searchfe/inject-js

inject-js 需要 Reflect Metadata 来在运行时决定依赖类型,你的 tsconfig.json 需要包含以下的设置:

{
  "compilerOptions": {
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true
  }
}

另外因为该库依赖 Reflect 的使用,确保运行时存在 Reflect API 的 Polyfill,比如以下之一:

使用

以下是一些使用案例,更多细节请参考 API 文档

@injectable

@injectable 来装饰一个 Service,这样 inject-js 就可以(借由 metadata)得知它的依赖并在运行时注入。

// car.ts
import { injectable } from 'inject-js';
import { Wheel } from './wheel';

@injectable
export class Car {
    constructor(private wheel: Wheel) {}
}

// wheel.ts
import { injectable } from 'inject-js';

@injectable
export class Wheel {
    constructor() {}
}

// index.ts 应用入口
import { Container } from 'inject-js';
import { Car } from './car';
import { Wheel } from './wheel;

const di = new Container();
di.addService(Car);
di.addService(Wheel);
const car = di.create(Car);

@inject

@inject(token) 来装饰一个依赖(构造参数),来指定被注入的类。token 即为当前容器内 Provider 的唯一标识。 用于没有 Service 声明的场景(只有 Provider),或者没有 Metadata API 支持的场景。 也就是说借此可以在 JavaScript 代码中使用 inject-js。

import { inject } from 'inject-js';
import { Wheel } from './wheel';

@injectable
export class Car {
    constructor(@inject('Wheel') private wheel: Wheel) {}
}

// index.ts 应用入口
import { Container } from 'inject-js';
import { Car } from './car';
import { Wheel } from './wheel';

const di = new Container();
di.addService('Wheel', Wheel);
di.addService(Car);
const car = di.create(Car);

@service

如果 Container 实例就在定义 Service 的上下文中,可以用 @service 装饰器来直接注册:

const container = new Container();

@service(container)
class FooService {}

// 相当于:

const container = new Container();

@injectable
class FooService {}

container.addService(FooService)

Container

Container 会维护一个 Providers 集合,以及每个 Provider 对应的 Token。需要创建实例时,会根据 Token 查找对应的 Provider 并进行创建。 我们提供了如下几种注册 Provider 的方式:

  • .addProvider():注册一个具有 .create(): Service 方法的 Provider 类(工厂类),其余注册方式都是用 addProvider 实现的。
  • .addFactory():注册一个会返回 Service 实例的方法(工厂方法)。
  • .addService():注册一个具体的 Service 类。
  • .addValue():注册一个具体的值。

示例

在 demo 下包含了一个使用 inject-js 的示例。可以按以下步骤执行该示例:

  1. 进入 inject-js 项目根目录。
  2. 构建 inject-js:npm install && npm run build
  3. 执行 demo:npm run demo

Keywords

FAQs

Package last updated on 25 Jan 2024

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc