Security News
ESLint is Now Language-Agnostic: Linting JSON, Markdown, and Beyond
ESLint has added JSON and Markdown linting support with new officially-supported plugins, expanding its versatility beyond JavaScript.
mana-syringe
Advanced tools
[![NPM version](https://img.shields.io/npm/v/mana-syringe.svg?style=flat)](https://npmjs.org/package/mana-syringe) [![NPM downloads](https://img.shields.io/npm/dm/mana-syringe.svg?style=flat)](https://npmjs.org/package/mana-syringe)
提供易于使用的依赖注入容器,参考 TSyringe 项目,参考并基于 inversify。
npm i mana-syringe --save
注入绑定对象所使用的的标识,可以带有一定的类型约束
Token<T> = string | symbol | Newable<T> | Abstract<T> | Syringe.DefinedToken<T>;
我们可以比较开放的使用标识,考虑到多包的协作,一般会使用 symbol 类型,标识默认支持单绑定,需要使用多绑定时,应该使用 Syringe.defineToken 方法获得,其接受是否可多绑定的设置。
包含一组绑定标识与注入对象关系描述的上下文成为容器,当我们通过容器获取实例时,容器会根据注入对象及其与标识的关系自动构建所需的其他实例。
容器会根据注入对象的生命期描述托管这些对象。
export enum Lifecycle {
singleton = 'singleton',
transient = 'transient',
}
我们提供了一组对类与属性的装饰器函数,用来快速完成基于依赖注入的类型描述,并完成基本的绑定关系描述。
@singleton()
class Shuriken implements Weapon {
public hit() {
console.log('Shuriken hit');
}
}
@transient()
class Ninja {
@inject(Weapon) public weapon: Weapon;
public hit() {
this.weapon.hit();
}
}
用户可以手动创建容器,使用全局默认的容器,或者创建子容器
import { GlobalContainer, Container } from './container';
const global = GlobalContainer;
const container = new Container();
const child = container.createChild();
容器上暴露了 register 方法,这个 API 是整个体系的核心。 register 方法有两种签名
register<T = any>(options: Syringe.InjectOption<T>): void;
register<T = any>(token: Syringe.Token<T>, options?: Syringe.InjectOption<T>): void;
可以调用容器实例上的 register 方法,也可以直接调用全局的 register 方法,其相对于调用 GlobalContainer 的方法。
从签名可以看出,注册绑定需要一组配置,在不同场景下配置会有所不同,可能出现的配置项如下
interface {
token?: MaybeArray<UnionToken<T>>;
contrib?: MaybeArray<Token<T>>;
lifecycle?: Lifecycle;
useClass?: MaybeArray<Class<T>>;
useDynamic?: MaybeArray<Dynamic<T>>;
useFactory?: MaybeArray<Factory<T>>;
useValue?: T;
}
@singleton()
class Shuriken implements Weapon {
public hit() {
console.log('Shuriken hit');
}
}
GlobalContainer.register(Shuriken);
GlobalContainer.register({ token: Shuriken, useClass: Shuriken });
可以通过用一组注册动作创建一个模块,方便在不同容器上下文间内加载
const module = Module(register => {
register(Shuriken);
});
GlobalContainer.load(module);
为了方便注册扩展点,容器提供了一组扩展的注册与使用接口。扩展点定义使用的 token 必须为 DefinedToken。
const Waepon = Syringe.defineToken('Weapon');
@singleton({ contrib: Weapon })
class Shuriken implements Weapon {
public hit() {
console.log('Shuriken hit');
}
}
const module = Module(register => {
Contribution.register(register, Weapon);
register(Shuriken);
register(Ninja);
});
@transient()
class Ninja {
@contrib(Weapon) public weapons: Weapon[];
}
FAQs
IoC library for mana, easily to use.
The npm package mana-syringe receives a total of 21,225 weekly downloads. As such, mana-syringe popularity was classified as popular.
We found that mana-syringe demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
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.
Security News
ESLint has added JSON and Markdown linting support with new officially-supported plugins, expanding its versatility beyond JavaScript.
Security News
Members Hub is conducting large-scale campaigns to artificially boost Discord server metrics, undermining community trust and platform integrity.
Security News
NIST has failed to meet its self-imposed deadline of clearing the NVD's backlog by the end of the fiscal year. Meanwhile, CVE's awaiting analysis have increased by 33% since June.