项目作者: inversify

项目描述 :
Some helpers for the development of InversifyJS applications with VanillaJS or Babel
高级语言: TypeScript
项目地址: git://github.com/inversify/inversify-vanillajs-helpers.git
创建时间: 2016-09-15T14:36:41Z
项目社区:https://github.com/inversify/inversify-vanillajs-helpers

开源协议:MIT License

下载


inversify-vanillajs-helpers

Join the chat at https://gitter.im/inversify/inversify-vanillajs-helpers
Build Status
Test Coverage
npm version
Dependencies
img
img
Known Vulnerabilities

NPM
NPM

Some helper for the development of InversifyJS applications with VanillaJS

Installation

  1. $ npm install inversify-vanillajs-helpers

Usage

  1. import { helpers } from "inversify-vanillajs-helpers";
  1. var helpers = require("inversify-vanillajs-helpers").helpers;

Annotation helper

Helps you to reduce annotation boilerplate when working with VanillaJS so instead of writting:

  1. inversify.decorate(inversify.injectable(), Ninja);
  2. inversify.decorate(inversify.inject(TYPES.Katana), Ninja, 0);
  3. inversify.decorate(inversify.inject(TYPES.Shuriken), Ninja, 1);

You can just write:

  1. helpers.annotate(Ninja, [TYPES.Katana, TYPES.Shuriken]);

Let’s take a look to an example:

  1. var inversify = require("inversify");
  2. var helpers = require("inversify-vanillajs-helpers").helpers;
  3. require("reflect-metadata");
  4. var TYPES = {
  5. Ninja: 'Ninja',
  6. Katana: 'Katana',
  7. Shuriken: 'Shuriken'
  8. }
  9. class Katana {
  10. hit () {
  11. return 'cut!'
  12. }
  13. }
  14. helpers.annotate(Katana);
  15. class Shuriken {
  16. throw () {
  17. return 'hit!'
  18. }
  19. }
  20. helpers.annotate(Shuriken);
  21. class Ninja {
  22. constructor(katana, shuriken) {
  23. this._katana = katana;
  24. this._shuriken = shuriken;
  25. }
  26. fight () { return this._katana.hit() }
  27. sneak () { return this._shuriken.throw() }
  28. }
  29. helpers.annotate(Ninja, [TYPES.Katana, TYPES.Shuriken]);
  30. // Declare bindings
  31. var container = new inversify.Container()
  32. container.bind(TYPES.Ninja).to(Ninja);
  33. container.bind(TYPES.Katana).to(Katana);
  34. container.bind(TYPES.Shuriken).to(Shuriken);
  35. // Resolve dependencies
  36. var ninja = container.get(TYPES.Ninja);
  37. console.log(ninja.fight(), ninja.sneak());

Named annotations

It is also possible to declare named metadata using the annotation helper:

  1. helpers.annotate(
  2. Ninja,
  3. [
  4. { type: TYPES.Katana, named: "not-throwable" },
  5. { type: TYPES.Shuriken, named: "throwable" }
  6. ]
  7. );

Tagged annotations

It is also possible to declare tagged metadata using the annotation helper:

  1. helpers.annotate(
  2. Ninja,
  3. [
  4. { type: TYPES.Katana, tagged: { key: "throwable", value: false } },
  5. { type: TYPES.Shuriken, tagged: { key: "throwable", value: true } }
  6. ]
  7. );

Registration helper

Helps you to reduce annotation and registration boilerplate when working with VanillaJS so instead of writting:

  1. inversify.decorate(inversify.injectable(), Ninja);
  2. inversify.decorate(inversify.inject(TYPES.Katana), Ninja, 0);
  3. inversify.decorate(inversify.inject(TYPES.Shuriken), Ninja, 1);
  4. container.bind(TYPES.Ninja).to(Ninja);

You can just write:

  1. let register = helpers.register(container);
  2. register(TYPES.Ninja, [TYPES.Katana, TYPES.Shuriken])(Ninja);

This helper can also be used as a class decorator when using Babel (continue reading for more details):

  1. let register = helpers.register(container);
  2. @register(TYPES.Ninja, [TYPES.Katana, TYPES.Shuriken])
  3. class Ninja {
  4. constructor(katana, shuriken) {
  5. this._katana = katana;
  6. this._shuriken = shuriken;
  7. }
  8. fight () { return this._katana.hit() }
  9. sneak () { return this._shuriken.throw() }
  10. }

Let’s take a look to an example:

  1. var inversify = require("inversify");
  2. var helpers = require("inversify-vanillajs-helpers").helpers;
  3. require("reflect-metadata");
  4. var TYPES = {
  5. Ninja: 'Ninja',
  6. Katana: 'Katana',
  7. Shuriken: 'Shuriken'
  8. }
  9. class Katana {
  10. hit () {
  11. return 'cut!'
  12. }
  13. }
  14. class Shuriken {
  15. throw () {
  16. return 'hit!'
  17. }
  18. }
  19. class Ninja {
  20. constructor(katana, shuriken) {
  21. this._katana = katana;
  22. this._shuriken = shuriken;
  23. }
  24. fight () { return this._katana.hit() }
  25. sneak () { return this._shuriken.throw() }
  26. }
  27. // Declare bindings
  28. var container = new inversify.Container();
  29. var register = helpers.register(container);
  30. register(TYPES.Katana)(Katana);
  31. register(TYPES.Shuriken)(Shuriken);
  32. register(TYPES.Ninja, [TYPES.Katana, TYPES.Shuriken])(Ninja);
  33. // Resolve dependencies
  34. var ninja = container.get(TYPES.Ninja);
  35. console.log(ninja.fight(), ninja.sneak());

We can use the helpers to register many types of bindings.

registerSelf

  1. var registerSelf = helpers.registerSelf(container);
  2. registerSelf()(Katana);

registerConstantValue

  1. var registerConstantValue = helpers.registerConstantValue(container);
  2. registerConstantValue(TYPES.Katana, new Katana());

registerDynamicValue

  1. var registerDynamicValue = helpers.registerDynamicValue(container);
  2. registerDynamicValue(TYPES.Katana, (context) => { new Katana(); });

registerConstructor

  1. var registerConstructor = helpers.registerConstructor(container);
  2. registerConstructor(TYPES.Katana)(Katana);

registerFunction

  1. var registerFunction = helpers.registerFunction(container);
  2. registerFunction(TYPES.SomeFunction, () {
  3. console.log("I'm doing something...");
  4. });

registerAutoFactory

  1. var registerAutoFactory = helpers.registerAutoFactory(container);
  2. registerAutoFactory(TYPES.KatanaFactory, TYPES.Katana);

registerFactory

  1. var registerFactory = helpers.registerFactory(container);
  2. registerFactory(TYPES.KatanaFactory, (context) => {
  3. return () => {
  4. return context.container.get("Katana");
  5. };
  6. });

registerProvider

  1. var registerProvider = helpers.registerProvider(container);
  2. registerProvider(TYPES.KatanaProvider, (context) => {
  3. return () => {
  4. return new Promise<Katana>((resolve) => {
  5. let katana = context.container.get("Katana");
  6. resolve(katana);
  7. });
  8. };
  9. });

Declaring binding constraints

The register helper allows access to the fluent binding declaration API:

  1. var register = helpers.register(container);
  2. register(TYPES.Weapon, (b) => {
  3. b.whenTargetTagged("throwable", false);
  4. })(Katana);
  5. register(TYPES.Weapon, (b) => {
  6. b.whenTargetTagged("throwable", true);
  7. })(Shuriken);
  8. register(TYPES.Ninja, [
  9. { tagged: { key: "throwable", value: false }, type: "Weapon" },
  10. { tagged: { key: "throwable", value: true }, type: "Weapon" }
  11. ])(Ninja);

Babel decorators

If you are using babel you can also use the register helper as a class
decorator with the transform-decorators-legacy plugin.

  1. let helpers = require("inversify-vanillajs-helpers").helpers;
  2. let inversify = require("inversify");
  3. require("reflect-metadata");
  4. let container = new inversify.Container();
  5. let register = helpers.register(container);
  6. let TYPE = {
  7. Warrior: "Warrior",
  8. Weapon: "Weapon"
  9. };
  10. @register(
  11. TYPE.Weapon, [],
  12. (b) => { b.whenTargetTagged("throwable", false); }
  13. )
  14. class Katana {
  15. constructor() {
  16. this.name = "Katana";
  17. }
  18. }
  19. @register(
  20. TYPE.Weapon, [],
  21. (b) => { b.whenTargetTagged("throwable", true); }
  22. )
  23. class Shuriken {
  24. constructor() {
  25. this.name = "Shuriken";
  26. }
  27. }
  28. @register(
  29. TYPE.Warrior,
  30. [
  31. { tagged: { key: "throwable", value: false }, type: TYPE.Weapon },
  32. { tagged: { key: "throwable", value: true }, type: TYPE.Weapon }
  33. ]
  34. )
  35. class Ninja {
  36. constructor(primaryWeapon, secondaryWeapon) {
  37. this.primaryWeapon = primaryWeapon;
  38. this.secondaryWeapon = secondaryWeapon;
  39. }
  40. }
  41. let ninja = container.get(TYPE.Warrior);
  42. expect(ninja.primaryWeapon.name).to.eql("Katana");
  43. expect(ninja.secondaryWeapon.name).to.eql("Shuriken");

Live demo

A live demo can be found here.

  1. var helpers = require("inversify-vanillajs-helpers").helpers;
  2. var inversify = require("inversify");
  3. require("reflect-metadata");
  4. class Katana {
  5. constructor() {
  6. this.name = "Katana";
  7. }
  8. }
  9. class Shuriken {
  10. constructor() {
  11. this.name = "Shuriken";
  12. }
  13. }
  14. class Ninja {
  15. constructor(primaryWeapon, secondaryWeapon) {
  16. this.primaryWeapon = primaryWeapon;
  17. this.secondaryWeapon = secondaryWeapon;
  18. }
  19. }
  20. let container = new inversify.Container();
  21. let register = helpers.register(container);
  22. let TYPE = {
  23. Warrior: "Warrior",
  24. Weapon: "Weapon"
  25. };
  26. register(TYPE.Weapon, [], (b) => b.whenTargetTagged("throwable", false))(Katana);
  27. register(TYPE.Weapon, [], (b) => b.whenTargetTagged("throwable", true))(Shuriken);
  28. register(TYPE.Warrior, [
  29. { tagged: { key: "throwable", value: false }, type: TYPE.Weapon },
  30. { tagged: { key: "throwable", value: true }, type: TYPE.Weapon }
  31. ])(Ninja);
  32. container.get(TYPE.Warrior);