{"_id":"mana-syringe","_rev":"3329040","name":"mana-syringe","description":"IoC library for mana, easily to use.","dist-tags":{"latest":"0.3.2","next":"0.2.2-next.0"},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"time":{"modified":"2024-07-10T07:07:15.000Z","created":"2021-09-12T15:39:06.423Z","0.3.2":"2022-09-07T12:26:31.842Z","0.3.1":"2022-03-06T12:46:22.531Z","0.3.0":"2022-02-22T02:07:03.622Z","0.2.2":"2021-11-12T09:40:40.422Z","0.2.2-next.0":"2021-11-12T09:14:26.346Z","0.2.1":"2021-11-11T03:35:20.915Z","0.2.0":"2021-11-07T10:04:17.480Z","0.1.0":"2021-10-01T05:15:14.918Z","0.0.1":"2021-09-12T15:39:06.423Z"},"users":{},"versions":{"0.3.2":{"name":"mana-syringe","keywords":["mana","syringe","inversify"],"description":"IoC library for mana, easily to use.","version":"0.3.2","typings":"lib/index.d.ts","main":"lib/index.js","module":"es/index.js","unpkg":"dist/index.umd.min.js","license":"MIT","dependencies":{"inversify":"^5.0.1"},"scripts":{"prepare":"yarn run clean && yarn run build","lint":"manarun lint","clean":"manarun clean","build":"manarun build","watch":"manarun watch"},"gitHead":"ecb2f9cc53e9ca9f3c00c5de0ee4ab2f9c8292bd","_id":"mana-syringe@0.3.2","_nodeVersion":"16.13.0","_npmVersion":"lerna/3.22.1/node@v16.13.0+arm64 (darwin)","dist":{"shasum":"9c82eccf451111a4d99ed2d855757b39b33e367e","size":170357,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.3.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.3.2.tgz"},"_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.3.2_1662553591584_0.7191498199866364"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2022-09-07T12:38:04.336Z","publish_time":1662553591842,"_cnpm_publish_time":1662553591842},"0.3.1":{"name":"mana-syringe","keywords":["mana","syringe","inversify"],"description":"IoC library for mana, easily to use.","version":"0.3.1","typings":"lib/index.d.ts","main":"lib/index.js","module":"es/index.js","unpkg":"dist/index.umd.min.js","dependencies":{"inversify":"^5.0.1"},"scripts":{"prepare":"yarn run clean && yarn run build","lint":"manarun lint","clean":"manarun clean","build":"manarun build","watch":"manarun watch"},"gitHead":"d69ec2f52849705ca5e771cb7ecb3b16fda15062","_id":"mana-syringe@0.3.1","_nodeVersion":"16.13.2","_npmVersion":"lerna/3.22.1/node@v16.13.2+x64 (linux)","dist":{"shasum":"e6c74b3320d92ad63baddba934a105e86a7c900d","size":170071,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.3.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.3.1.tgz"},"_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.3.1_1646570782311_0.7026191405302726"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2022-03-06T12:46:31.506Z","publish_time":1646570782531,"_cnpm_publish_time":1646570782531},"0.3.0":{"name":"mana-syringe","keywords":["mana","syringe","inversify"],"description":"IoC library for mana, easily to use.","version":"0.3.0","typings":"dist/index.d.ts","main":"dist/index.js","module":"dist/index.esm.js","unpkg":"dist/index.umd.min.js","dependencies":{"inversify":"^5.0.1"},"scripts":{"prepare":"yarn run clean && yarn run build","lint":"manarun lint","clean":"manarun clean","build":"manarun build","watch":"manarun watch"},"gitHead":"b57985192b7ff475d7ace7423519cf096d12174a","_id":"mana-syringe@0.3.0","_nodeVersion":"16.13.2","_npmVersion":"lerna/3.22.1/node@v16.13.2+x64 (linux)","dist":{"shasum":"b54cfd669374753148a72c490b2245e3ad34606d","size":157872,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.3.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.3.0.tgz"},"_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.3.0_1645495623444_0.7645067228728213"},"_hasShrinkwrap":false,"_cnpmcore_publish_time":"2022-02-22T02:07:12.907Z","publish_time":1645495623622,"_cnpm_publish_time":1645495623622},"0.2.2":{"name":"mana-syringe","keywords":[],"version":"0.2.2","typings":"dist/index.d.ts","main":"dist/index.js","module":"dist/index.esm.js","unpkg":"dist/index.umd.min.js","dependencies":{"inversify":"^5.0.1"},"scripts":{"prepare":"yarn run clean && yarn run build","lint":"manarun lint","clean":"manarun clean","build":"manarun build","watch":"manarun watch"},"gitHead":"49568bfb1e00a0c1e6d74d6adcaa38da1a17891f","description":"[![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)","_id":"mana-syringe@0.2.2","_nodeVersion":"16.13.0","_npmVersion":"lerna/3.22.1/node@v16.13.0+x64 (linux)","dist":{"shasum":"5bb973a778c9c91277e6f4fa3cfda8df618aa4ba","size":155834,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.2.2.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.2.2.tgz"},"_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.2.2_1636710040190_0.9476678309591171"},"_hasShrinkwrap":false,"publish_time":1636710040422,"_cnpm_publish_time":1636710040422},"0.2.2-next.0":{"name":"mana-syringe","keywords":[],"version":"0.2.2-next.0","typings":"dist/index.d.ts","main":"dist/index.js","module":"dist/index.esm.js","unpkg":"dist/index.umd.min.js","dependencies":{"inversify":"^5.0.1"},"scripts":{"prepare":"yarn run clean && yarn run build","lint":"manarun lint","clean":"manarun clean","build":"manarun build","watch":"manarun watch"},"gitHead":"59e398ac381ef9128036a6b42c8994d7452c3b86","readmeFilename":"README.md","description":"[![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)","_id":"mana-syringe@0.2.2-next.0","_nodeVersion":"16.13.0","_npmVersion":"lerna/3.22.1/node@v16.13.0+x64 (linux)","dist":{"shasum":"c4f5b4ceba2f75ddcbb9ac8b00a9226361b0129e","size":155840,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.2.2-next.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.2.2-next.0.tgz"},"_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.2.2-next.0_1636708466161_0.5338502292486411"},"_hasShrinkwrap":false,"publish_time":1636708466346,"_cnpm_publish_time":1636708466346},"0.2.1":{"name":"mana-syringe","keywords":[],"version":"0.2.1","typings":"dist/index.d.ts","main":"dist/index.js","module":"dist/index.esm.js","browser":"index.umd.js","dependencies":{"inversify":"^5.0.1"},"devDependencies":{"mana-scripts":"^0.2.0"},"scripts":{"prepare":"yarn run clean && yarn run build","lint":"manarun lint","clean":"manarun clean","build":"manarun build","watch":"manarun watch"},"gitHead":"8d6f4622e203b5df7ead3650699aeb8dca719a03","description":"[![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)","_id":"mana-syringe@0.2.1","_nodeVersion":"16.13.0","_npmVersion":"lerna/3.22.1/node@v16.13.0+x64 (linux)","dist":{"shasum":"1090ea7f91fb5edcf7a0a54fe1472e88e631802e","size":155513,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.2.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.2.1.tgz"},"_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.2.1_1636601720688_0.860745297202518"},"_hasShrinkwrap":false,"publish_time":1636601720915,"_cnpm_publish_time":1636601720915},"0.2.0":{"name":"mana-syringe","keywords":[],"version":"0.2.0","typings":"dist/index.d.ts","main":"dist/index.js","module":"dist/index.esm.js","dependencies":{"debug":"^4.3.1","inversify":"^5.0.1"},"devDependencies":{"mana-scripts":"^0.2.0"},"scripts":{"prepare":"yarn run clean && yarn run build","lint":"manarun lint","clean":"manarun clean","build":"manarun build","watch":"manarun watch"},"gitHead":"6d25a80429a48414e6d8291097c9a335b83e20e9","description":"[![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)","_id":"mana-syringe@0.2.0","_nodeVersion":"14.17.6","_npmVersion":"lerna/3.22.1/node@v14.17.6+x64 (win32)","dist":{"shasum":"1b44a2b4c87451cf148efd4265e89debb4603de1","size":39977,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.2.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.2.0.tgz"},"_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.2.0_1636279457283_0.5787563006294263"},"_hasShrinkwrap":false,"publish_time":1636279457480,"_cnpm_publish_time":1636279457480},"0.1.0":{"name":"mana-syringe","keywords":[],"version":"0.1.0","typings":"dist/index.d.ts","main":"dist/index.js","module":"dist/index.esm.js","dependencies":{"debug":"^4.3.1","inversify":"^5.0.1"},"devDependencies":{"mana-scripts":"^0.1.0"},"scripts":{"prepare":"yarn run clean && yarn run build","lint":"manarun lint","clean":"manarun clean","build":"manarun build","watch":"manarun watch"},"gitHead":"6b8dca016bab39959aecfa75e4e35dc76efcae91","description":"[![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)","_id":"mana-syringe@0.1.0","_nodeVersion":"14.17.0","_npmVersion":"lerna/3.22.1/node@v14.17.0+x64 (darwin)","_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"dist":{"shasum":"38e26b763f7d997a7b4d04dde8c86cf74ef01695","size":37595,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.1.0.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.1.0.tgz"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.1.0_1633065314760_0.14152708616151588"},"_hasShrinkwrap":false,"publish_time":1633065314918,"_cnpm_publish_time":1633065314918},"0.0.1":{"name":"mana-syringe","version":"0.0.1","description":"","main":"index.js","scripts":{"test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"brokun","email":"brokun0128@gmail.com"},"license":"MIT","_id":"mana-syringe@0.0.1","_nodeVersion":"14.17.6","_npmVersion":"6.14.15","dist":{"shasum":"e24fe0c5306c1c3684f198e1fe7d6cc85a922055","size":267,"noattachment":false,"key":"/mana-syringe/-/mana-syringe-0.0.1.tgz","tarball":"http://registry.cnpm.dingdandao.com/mana-syringe/download/mana-syringe-0.0.1.tgz"},"_npmUser":{"name":"brokun","email":"brokun0128@gmail.com"},"directories":{},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/mana-syringe_0.0.1_1631461146298_0.4452732752652473"},"_hasShrinkwrap":false,"publish_time":1631461146423,"_cnpm_publish_time":1631461146423}},"readme":"# mana-syringe\n\nIoC library for mana, easily to use.\n\n[![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)\n\n提供易于使用的依赖注入容器，参考 TSyringe 项目，参考并基于 inversify。\n\n## 安装\n\n```bash\nnpm i mana-syringe --save\n```\n\n## 概念与使用\n\n### 注入标识 token\n\n注入绑定对象所使用的的标识，可以带有一定的类型约束\n\n```typescript\nToken<T> = string | symbol | Newable<T> | Abstract<T> | Syringe.DefinedToken<T>;\n```\n\n除 `Syringe.DefinedToken<T>` 默认支持多绑定外，注入标识只支持单一绑定关系。可以使用如下 API 生成 DefinedToken\n\n```typescript\nSyringe.defineToken('sample-token');\n```\n\n### 容器 Container\n\n包含一组绑定标识与注入对象关系描述的上下文成为容器，当我们通过容器获取实例时，容器会根据注入对象及其与标识的关系自动构建所需的其他实例。\n\n用户可以手动创建容器，使用全局默认的容器，或者创建子容器\n\n```typescript\nimport { GlobalContainer, Container } from './container';\nconst global = GlobalContainer;\nconst container = new Container();\nconst child = container.createChild();\n```\n\n我们使用 `token` 从容器里获取对象\n\n```typescript\nconst ninja = child.get(Ninja);\n```\n\n当我们从子容器中获取对象时，会先从子容器查找绑定关系和缓存信息，如果不存在，则继续向父容器查找。\n\n### 注册 register\n\n容器上暴露了 register 方法，这个 API 是整个体系的核心。 register 方法有两种签名\n\n```typescript\nregister<T = any>(options: Syringe.InjectOption<T>): void;\nregister<T = any>(token: Syringe.Token<T>, options?: Syringe.InjectOption<T>): void;\n```\n\n可以调用容器实例上的 register 方法，也可以直接调用全局的 register 方法，其相对于调用 GlobalContainer 的方法。\n\n从签名可以看出，注册绑定需要一组配置，在不同场景下配置会有所不同，可能出现的配置项如下\n\n```typescript\ninterface {\n  token?: MaybeArray<UnionToken<T>>;\n  contrib?: MaybeArray<Token<T>>;\n  lifecycle?: Lifecycle;\n  useClass?: MaybeArray<Class<T>>;\n  useDynamic?: MaybeArray<Dynamic<T>>;\n  useFactory?: MaybeArray<Factory<T>>;\n  useValue?: T;\n}\n```\n\n- token 可以为数组，本次绑定关系需要声明的标识，不同标识分别注册\n- contrib 可以为数组，可用于注册扩展点，也可用于注册 token 别名\n- useClass 可以为数组，给出一个或多个类\n- useToken 可以为数组，根据 token 从容器内动态获取对象\n- useFactory 可以为数组，基于带有容器信息的上下文，给出动态获得实例的方法\n- useDynamic 可以为数组，基于带有容器信息的上下文给出实例\n- useValue 可以为数组，常量直接给出值\n\n#### 生命期 lifecycle\n\n容器会根据注入对象的生命期描述托管这些对象，决定是否使用缓存等。\n\n```typescript\nexport enum Lifecycle {\n  singleton = 'singleton',\n  transient = 'transient',\n}\n```\n\n#### 注册类和别名\n\n```typescript\n@singleton({ contrib: Alias })\nclass Shuriken implements Weapon {\n  public hit() {\n    console.log('Shuriken hit');\n  }\n}\nGlobalContainer.register(Shuriken);\nGlobalContainer.register(Shuriken, {\n  useClass: Shuriken,\n  lifecycle: Syringe.Lifecycle.singleton,\n});\n```\n\n通过 token 注册后，每个 token 的注册关系是独立的，通过他们获取对象可以是不同的值，通过 contrib 注册的是别名关系，他们应该获取到同一个对象。不管是 token 还是 contrib，根据对多绑定的支持情况做处理。\n\n```typescript\nconst Weapon = Symbol('Weapon');\nconst WeaponArray = Syringe.defineToken('Weapon');\n@singleton({ contrib: Weapon })\nclass Shuriken implements Weapon {\n  public hit() {\n    console.log('Shuriken hit');\n  }\n}\nGlobalContainer.register({ token: Weapon, useValue: undefined });\nGlobalContainer.register({ token: WeaponArray, useValue: undefined });\nGlobalContainer.register(Shuriken);\nGlobalContainer.get(Weapon); // Shuriken\nGlobalContainer.getAll(WeaponArray); // [undefined, Shuriken]\n```\n\n#### 注册值\n\n```typescript\nconst ConstantValue = Symbol('ConstantValue');\nGlobalContainer.register({ token: ConstantValue, useValue: {} });\n```\n\n#### 注册动态值\n\n```typescript\nconst NinjaAlias = Symbol('NinjaAlias');\nGlobalContainer.register({\n  token: NinjaAlias,\n  useDynamic: ctx => ctx.container.get(Ninja),\n});\n```\n\n### 装饰器\n\n我们提供了一组对类与属性的装饰器函数，用来快速完成基于依赖注入的类型描述，并完成基本的绑定关系描述。\n\n- injectable: 通用装饰器，接受所有绑定描述参数\n- singleton: 单例装饰器，接受除生命期外的描述参数\n- transient: 多例装饰器，接受除生命期外的描述参数\n- inject: 注入，接受注入标识作为参数，并接受类型描述\n\n```typescript\n@singleton()\nclass Shuriken implements Weapon {\n  public hit() {\n    console.log('Shuriken hit');\n  }\n}\n@transient()\nclass Ninja {\n  @inject(Weapon) public weapon: Weapon;\n  public hit() {\n    this.weapon.hit();\n  }\n}\n```\n\n### 扩展点 Contribution\n\n我们通常将依赖注入的多绑定模式以扩展点的形式使用，为了方便在项目中使用这种模式，我们内置了对扩展点的定义和支持。\n\n#### 扩展点的定义与注册\n\n```typescript\nconst Weapon = Syringe.defineToken('Weapon');\nContribution.register(GlobalContainer.register, Weapon);\n```\n\n#### 扩展服务 Contribution.Provider\n\n内置了扩展点的管理服务，用户一般直接使用即可，注册扩展点以后，通过如下方式获取扩展服务\n\n```typescript\n@contrib(Weapon) public weaponProvider: Contribution.Provider<Weapon>;\n```\n\n等价于如下写法\n\n```typescript\n@inject(Contribution.Provider) @named(Weapon) public weaponProvider: Contribution.Provider<Weapon>;\n\n```\n\n#### 扩展点示例\n\n```typescript\nconst Weapon = Syringe.defineToken('Weapon');\nContribution.register(GlobalContainer.register, Weapon);\n@singleton({ contrib: Weapon })\nclass Shuriken implements Weapon {\n  public hit() {\n    console.log('Shuriken hit');\n  }\n}\n@transient()\nclass Ninja {\n  @contrib(Weapon) public weaponProvider: Contribution.Provider<Weapon>;\n  hit() {\n    const weapons = this.weaponProvider.getContributions();\n    weapons.forEach(w => w.hit());\n  }\n}\nconst module = Module(register => {\n  Contribution.register(register, Weapon);\n  register(Shuriken);\n  register(Ninja);\n});\nGlobalContainer.register(Shuriken);\nGlobalContainer.register(Ninja);\nGlobalContainer.get(Ninja).hit(); // Shuriken hit\n```\n\n### 模块\n\n可以通过用一组注册动作创建一个模块，方便在不同容器上下文间内加载, 模块的构建支持注册函数和链式调用两种方式，前面扩展点示例里的模块也可以写成如下形式：\n\n```typescript\nconst module = Module().contribution(Weapon).register(Shuriken, Ninja);\n\nGlobalContainer.load(module);\n```\n\n- 相同 module 默认不重复加载。\n","_attachments":{},"license":"MIT"}