{"_id":"mana-syringe","_rev":"9-548946e5e4847925f3f5770d30bba08b","name":"mana-syringe","dist-tags":{"latest":"0.3.2","next":"0.2.2-next.0"},"versions":{"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":{"integrity":"sha512-yitUC+QpFElV6KcQg5CBmTSu4ApeDeQDBHMgJXpT+DZyA9NI4UQv0oWXd2SxTBpCxLuCu1KXjt8cRTj7TC2urw==","shasum":"e24fe0c5306c1c3684f198e1fe7d6cc85a922055","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.0.1.tgz","fileCount":1,"unpackedSize":237,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhPh8aCRA9TVsSAnZWagAAQXQP/1VjReuDcbOUpWPUYaak\nnGxx5gkHfGb9w1R4CeZCVKsTau2fZd6bR135K3wfEvKLfNL24WmX5DuABj5j\njXGP1BT2lp126comNvDiOnPrLz3MPdlH+6PCqQdP9HRaOzzv+CmG8Uu7N/NK\nvQ3BCTkVu+Lqxu+PKnfoh6+dYDEKBhVZBrdAm65ziwd2WXeR5KinnSNVQIW6\n/u8UYoXxMKYr6zwd3OtIEZEcd737PAEHyQYkjYmh04pZRkjW/rLf8jv+w1OL\nxs2Ctk5CCvavT2XsDvlEMgxwETC7WLq/HkIvRO4gb9tCOqyDGCU5apohWRre\nn7VsF8ZcQ7JRsup6XMbpThShtvEEwkFcLu+wuQse8weNkrbCfzPsJjpHXJ2x\nq2LVa8XSk9X9N7PxNmOqNmqSoboG32Sv6FMLGHK5v3IG+HZQaLxopAbLtjf5\nuYX2gXWao+Z9iH5KojDFbDBL/RmM4kY6SHwyM888aiyCmw02VU22Lg50a0DP\nIDmkIx50Hf0vr+A/4rJuRQCTldq8ypNAgS+wga9H69+zQuh7850353PyFfmA\nWnlSqEU6ikNB8QUFK1z1xUwn0ysRQSwzKp5AYnPzLO/oAoz4w5l0VUVFuZEY\ndIYbesoXAN4ghZ1PlqJwLJy7ZCPRgfDlKP0NZz6QKJGubPD51ACc92AzxPEP\nOJMX\r\n=RFov\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCGU121BPZTEuo3ZcLIEzHY7u8QJ3CqJWLrgsy1/HtmZQIhAJeNG3WEwT7TK4wnhkcOorLgF2GcR0ku7u64qOQb9T5D"}]},"_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},"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":{"integrity":"sha512-xR+bqpHswykAZGgnc/XqblA5L0yoTqhMTiq6NpWiQyCKK2EAzMttGu/JfyzistHXW0OE2q4JNtpty8CZRqulqg==","shasum":"38e26b763f7d997a7b4d04dde8c86cf74ef01695","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.1.0.tgz","fileCount":45,"unpackedSize":209606,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEBpSCRYYL1uJhU3aESPAF7Hy3KR0XSvU7ZNT4No9eZrAiEAkgjMdL6YHGUgbLZfz4iMqhU+QQafPkqeZO61pXJOWc0="}]},"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},"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":{"integrity":"sha512-gV9X6lzbCSvozhCz5ENt+Yv6MMMiDcdKJA+lJBFZi27z3eJfvnM25SDgrEps/qLhvZCN16m088m4UjduMpQPKw==","shasum":"1b44a2b4c87451cf148efd4265e89debb4603de1","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.2.0.tgz","fileCount":49,"unpackedSize":221542,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIF97Ur9MEHHZX6IeI0VInuXEVLTciOMkms7OzqUtUruOAiApLInodpGF0BSInKTgi3VTsrd3cmcsi8B+TP/gH45dqA=="}]},"_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},"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":{"integrity":"sha512-d7IdIaZFZV6TgQBCvV/Tc4m2rwIyl1nQGCPkdPCtISa1BJG4hzBHyzrMMUepWjDQAfxiFWXN2rMfDfH6H/4P4A==","shasum":"1090ea7f91fb5edcf7a0a54fe1472e88e631802e","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.2.1.tgz","fileCount":53,"unpackedSize":862385,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIE9/kbxIwFqrcTS0/9pbWQPFEF8gfvvYdESWRx50Y8LFAiEA8ymWbiRdKYPZlooe2dk4wsh65nP51P9RYrChVrTd1ak="}]},"_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},"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","readme":"# mana-syringe\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","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":{"integrity":"sha512-X6D01dXRwG/g8fqtgele1qZg8BB17SMSfkHqmgJ+PpJEjKJEh3KoA8jw85KSH5jTIWGsOyezIz9csQr+gPb7rA==","shasum":"c4f5b4ceba2f75ddcbb9ac8b00a9226361b0129e","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.2.2-next.0.tgz","fileCount":53,"unpackedSize":864348,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDn5uEBIiVnKEeSu7G7g7jkcCQFfT4FRVhiUo9EaFMdZAIgOIFGZeHQ+Esga1m6za8x6AxxepJD1oLzWxN722lrtgU="}]},"_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},"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":{"integrity":"sha512-Sv5r0/PrQRq4pW+9lDicGsEPzPLkd1PwjTs5zHUV1I293S3alkBNyuSjktVeBploofH8MAMLd4DS2crwct48wg==","shasum":"5bb973a778c9c91277e6f4fa3cfda8df618aa4ba","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.2.2.tgz","fileCount":53,"unpackedSize":864341,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCeh3SDGMzvDzCHfCQ8XQLpzHTWsBnVe0CaULrh+rx6NAIhAJCNe3+cgBthxgDWmFpARq6J8gmS63EenXCpKe9nNG3R"}]},"_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},"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":{"integrity":"sha512-2CBMyvv+41krXZvPQVQRPvJuknkgte3FV+8dIJ6rMRv6QUvXZd+v0gTBKEU6oDRaP6XrZctLXEhgLvUvkMmwlg==","shasum":"b54cfd669374753148a72c490b2245e3ad34606d","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.3.0.tgz","fileCount":53,"unpackedSize":875873,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiFEVHACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmqjGRAAgjO77suRM4WvSLzJRY6H6bShQEccPdDRdU5v10Hi/wRPCcuw\r\ntO7b/iwiJJkxyy1OB119LI9XBvYm4wmnnSiysS5su0AHLEYTGm0el8mcvyAZ\r\nNDrQcZJKUqhbz4tKEuR3JablQus9pkii0HDmr+ZOIVQPQWPoIUEhy7QqpY1U\r\nAnAalZlohfGAo1Qi0iGsfaMT28oR6CRcO8lmufjIzYbtg7MfW1G9ckrNxWfp\r\nfyK3a0x9ip+ZbPrnuWjBMW5LH594RGMx5pavtErHWwTBSIWo5XCDBQqQhD7j\r\nvr7whcLsr82ZkqBUvkUW78eHugN3FUt4oWJ9SL3i799ABv7jKtQT5X5P1U6G\r\ngW9g6SZ5SGrfOTj/nLpIN14nK2pvr0A9ItxgIdNU4bttcICQVC+3frdXLvg6\r\n8HCciLnWkHj5hM4GMFqLSAdz5b4/Ah7YlxuwJNMJCfZGGKlfKeykzeKmIvbm\r\nETNlLBk+ohJQlwjqLm574PI9HvSplV4MtHR8mXryKh1iXHX2Q5Pt4ORjqeaD\r\nCYNcKKljbKRH5pFO+5PLDN+l9e8xNH1aFfhY5DUhSR+6JehCAgKG6MViaXnP\r\n9AvL+t/3cxOnWFQtjob/ggPv7oaegWA3vIYxaOHBaUl9l3cGbaRxhnSNyGN2\r\nbsALCYH2X5cVNvk6APA6Ni1YgZqg4sG6IgI=\r\n=kSFq\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIDTK7d/oH8Ow3E6YmTirXOOF7lSjqn6kAoX4MUThf+9UAiA0hFaRm2VVG/KJn7SWD5bxAWUBEg/azPfKWaTJVuRbDA=="}]},"_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},"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":{"integrity":"sha512-27Gd/Yd9PAOP7JOYYLQmhZMxvt8sIbSqCHAamSVXbrWFe+KNkIE+78mloPfl/YSMPlooBO9abcB5j0ZozQ7fkg==","shasum":"e6c74b3320d92ad63baddba934a105e86a7c900d","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.3.1.tgz","fileCount":133,"unpackedSize":926927,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJiJK0eACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2VmpzbA//RJdndj2fL92KvJ9FC8dmtfqUrsR2Quc/87sQ8KpM/WlbIWQm\r\nbaEgkQNITRnLTLjmdjOySuoRJJ+ay5U87sAF7benybmsFkUAnLQytXVWSeUh\r\nFri9uoStahWHTugJwy+ERLV4qoriqWcORARppBI1Bd8+fuUBKZZCrNd9TnIi\r\nie0sHqKBil7z5kPvJgYwrFhJemdKDTSJLmtvBnAWntDH7qI0oGvbk++4dOH/\r\n8gaID0JcUgn1X2AgFt1+lL0EOjzoHyVg4Y9Lw4NhAEV0aGDEcndLQubHsG7Z\r\nqPYizTdXnENigDsAsvyo8tCcCjK4PFntxyswS+QDXTiAFlwFPyLKxuY1nq6r\r\ngVUs6SJSE45Ka4ajLkIoo/ojHvQBHh7s+1POHgTNutHNXp4KVRkwP4ayiOcu\r\no7APcjA9Rif0GAoAXMOwJ510kHWcDlET+yAkfu2smHjtyKUeBS8EoyiB4Y65\r\n7m3eokevcDMJ+eqE2GOVvdb4xM1/mE3Doen91HJDSyfIVMq0g884p/lIhk5y\r\n1kccuSbouVwnFfKNfkdqJP71ZFT2Y84wcmXxTt6cbsjyXuOc/b/hgsYE/hAc\r\nrscqX3u6F+2Qzcr1CqMntq4rkrqGfTcndBeGqyZ7rvqWtn6MhOMSxtO2sqf3\r\n8bR3kP7pLynqpr3U4MJyUyCh5Uqg/RPJfPk=\r\n=zn9A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCLj5WsLGJvZ+9r5WV5PExw27dXGvRLyMYq5rHh8OiCOgIhAO7Hblb4Qk2HHK/3ubEI3fPm6uDaU2Vw7quWzEh9rmeL"}]},"_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},"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":{"integrity":"sha512-2DZZj2dplm667q2gl+G2u3L0UleE2vK02PIFRgF7P0Uz7Aiq7KqXQRjx2af2SgRJ6JZ9B/LCVaBHBdvWZXGrbw==","shasum":"9c82eccf451111a4d99ed2d855757b39b33e367e","tarball":"https://registry.npmjs.org/mana-syringe/-/mana-syringe-0.3.2.tgz","fileCount":133,"unpackedSize":927308,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDNeZ6nQ45+OvtvS03sPycvdcuqp7M7vLZNegFh+FuGXQIgbItAEICmAx7sRN5SBIV908i0FWOtXObTcyLGM9+ypo0="}],"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v4.10.10\r\nComment: https://openpgpjs.org\r\n\r\nwsFzBAEBCAAGBQJjGI33ACEJED1NWxICdlZqFiEECWMYAoorWMhJKdjhPU1b\r\nEgJ2Vmomng//QHvJTGoxvRCxnPFEOUE0xyAugMnR1vBCNOcAjMe1aKjtHQtQ\r\nn3r3uStCo1PKRZKpAdbgYBilnhPeSYoaopmpQ1g0lVi36s3k5Uv+FwRdRb6c\r\n4i2P4x7bfiToBcACWzyNWTCasj+nNc/tZcqb4bV7yt/skQxhr0ON4Q23tnJq\r\nTqMd4WcXL/wA4lq+8RTtAutv5iHQqkmwvCoABaMuvCdbCnwwgbDZBYpcNmK/\r\nQ+lw0wbewaBiDSgbzJBw+pv1/QVpWmjZxue/KMU11cSXzuEZACfw2On5GXlU\r\nubJSFmWSeZ4vyZwEf2cLJgY3/CXq+/ae1qrwlEUUjkHZSUeOMUahyJNNDXGh\r\nIU3BU8PIxVPtNRTxKldigbFhNVKC8Gb3XDrGz8A8/5n3LwiSCsP4SY3lCOML\r\n5Fkb/DJoz3rUM3OpudL1spONvi8PPY8hiGIQr/NBZestZXa9IHd4Os8jxsOe\r\nm97qxJADy2Q1hJQ67QiUbJJtTKNah7rp+0ki6N/jJsm5HBbz0VlgMlabO/ZJ\r\nR+Xer5RKvyibP94v3pPCNa9nMmwUvuWhcf1bBDDMXpYAWWXNI/0oYbBXZ1k9\r\n6yxrQDkJLQw4MvmvnNdYQY6kRCVlaoSjmsBrqZ9LSXRNIP0mBEt/za1OCSI/\r\nrGcOxsPsJG8FgXUWhYTIZa1AezfydfyyVmA=\r\n=Y1hU\r\n-----END PGP SIGNATURE-----\r\n"},"_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}},"time":{"created":"2021-09-12T15:39:06.298Z","0.0.1":"2021-09-12T15:39:06.423Z","modified":"2022-09-07T12:26:31.949Z","0.1.0":"2021-10-01T05:15:14.918Z","0.2.0":"2021-11-07T10:04:17.480Z","0.2.1":"2021-11-11T03:35:20.915Z","0.2.2-next.0":"2021-11-12T09:14:26.346Z","0.2.2":"2021-11-12T09:40:40.422Z","0.3.0":"2022-02-22T02:07:03.622Z","0.3.1":"2022-03-06T12:46:22.531Z","0.3.2":"2022-09-07T12:26:31.842Z"},"maintainers":[{"name":"brokun","email":"brokun0128@gmail.com"}],"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","readmeFilename":"README.md","description":"IoC library for mana, easily to use.","keywords":["mana","syringe","inversify"],"license":"MIT"}