Skip to content

Commit

Permalink
Implements #348 (#349)
Browse files Browse the repository at this point in the history
* Fixed #345

* Implemented #348

* added docs
  • Loading branch information
remojansen committed Aug 25, 2016
1 parent 741ea4e commit 0d87faf
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 10 deletions.
15 changes: 15 additions & 0 deletions src/kernel/kernel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,21 @@ class Kernel implements interfaces.Kernel {
});
}

public getAllNamed<T>(serviceIdentifier: interfaces.ServiceIdentifier<T>, named: string): T[] {
return this.getAllTagged<T>(serviceIdentifier, METADATA_KEY.NAMED_TAG, named);
}

public getAllTagged<T>(serviceIdentifier: interfaces.ServiceIdentifier<T>, key: string, value: any): T[] {
let metadata = new Metadata(key, value);
let target = new Target(null, serviceIdentifier, metadata);
return this._get<T>({
contextInterceptor: (context: interfaces.Context) => { return context; },
multiInject: true,
serviceIdentifier: serviceIdentifier,
target: target
});
}

public set parent (kernel: interfaces.Kernel) {
this._parentKernel = kernel;
}
Expand Down
54 changes: 54 additions & 0 deletions test/kernel/kernel.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -550,4 +550,58 @@ describe("Kernel", () => {
expect(secondChildKernel.get(weaponIdentifier)).to.be.instanceOf(DivineRapier);
});

it("Should be able to resolve named multi-injection", () => {

let kernel = new Kernel();

interface Intl {
hello?: string;
goodbye?: string;
}

kernel.bind<Intl>("Intl").toConstantValue({ hello: "bonjour" }).whenTargetNamed("fr");
kernel.bind<Intl>("Intl").toConstantValue({ goodbye: "au revoir" }).whenTargetNamed("fr");

kernel.bind<Intl>("Intl").toConstantValue({ hello: "hola" }).whenTargetNamed("es");
kernel.bind<Intl>("Intl").toConstantValue({ goodbye: "adios" }).whenTargetNamed("es");

let fr = kernel.getAllNamed<Intl>("Intl", "fr");
expect(fr.length).to.eql(2);
expect(fr[0].hello).to.eql("bonjour");
expect(fr[1].goodbye).to.eql("au revoir");

let es = kernel.getAllNamed<Intl>("Intl", "es");
expect(es.length).to.eql(2);
expect(es[0].hello).to.eql("hola");
expect(es[1].goodbye).to.eql("adios");

});

it("Should be able to resolve tagged multi-injection", () => {

let kernel = new Kernel();

interface Intl {
hello?: string;
goodbye?: string;
}

kernel.bind<Intl>("Intl").toConstantValue({ hello: "bonjour" }).whenTargetTagged("lang", "fr");
kernel.bind<Intl>("Intl").toConstantValue({ goodbye: "au revoir" }).whenTargetTagged("lang", "fr");

kernel.bind<Intl>("Intl").toConstantValue({ hello: "hola" }).whenTargetTagged("lang", "es");
kernel.bind<Intl>("Intl").toConstantValue({ goodbye: "adios" }).whenTargetTagged("lang", "es");

let fr = kernel.getAllTagged<Intl>("Intl", "lang", "fr");
expect(fr.length).to.eql(2);
expect(fr[0].hello).to.eql("bonjour");
expect(fr[1].goodbye).to.eql("au revoir");

let es = kernel.getAllTagged<Intl>("Intl", "lang", "es");
expect(es.length).to.eql(2);
expect(es[0].hello).to.eql("hola");
expect(es[1].goodbye).to.eql("adios");

});

});
79 changes: 69 additions & 10 deletions wiki/get_all_named_tagged.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
# The Kernel API

The InversifyJS kernel provides some helpers to resolve multi-injections.

## Kernel.getAll<T>()
```ts
let kernel = new Kernel();
kernel.bind<Weapon>("Weapon").to(Katana);
kernel.bind<Weapon>("Weapon").to(Shuriken);

let weapons = kernel.getAll<Weapon>("Weapon"); // returns Weapon[]
```
The InversifyJS kernel provides some helpers to resolve multi-injections
and ambiguous bindings.

## Kernel.getNamed<T>()
Named bindings:
Expand All @@ -35,6 +27,73 @@ let katana = kernel.getTagged<Weapon>("Weapon", "faction", "samurai");
let shuriken = kernel.getTagged<Weapon>("Weapon", "faction", "ninja");
```

## Kernel.getAll<T>()
Get all available bindings for a given identifier:
```ts
let kernel = new Kernel();
kernel.bind<Weapon>("Weapon").to(Katana);
kernel.bind<Weapon>("Weapon").to(Shuriken);

let weapons = kernel.getAll<Weapon>("Weapon"); // returns Weapon[]
```

## Kernel.getAllNamed<T>()
Get all available bindings for a given identifier that match the given
named constraint:
```ts
let kernel = new Kernel();

interface Intl {
hello?: string;
goodbye?: string;
}

kernel.bind<Intl>("Intl").toConstantValue({ hello: "bonjour" }).whenTargetNamed("fr");
kernel.bind<Intl>("Intl").toConstantValue({ goodbye: "au revoir" }).whenTargetNamed("fr");

kernel.bind<Intl>("Intl").toConstantValue({ hello: "hola" }).whenTargetNamed("es");
kernel.bind<Intl>("Intl").toConstantValue({ goodbye: "adios" }).whenTargetNamed("es");

let fr = kernel.getAllNamed<Intl>("Intl", "fr");
expect(fr.length).to.eql(2);
expect(fr[0].hello).to.eql("bonjour");
expect(fr[1].goodbye).to.eql("au revoir");

let es = kernel.getAllNamed<Intl>("Intl", "es");
expect(es.length).to.eql(2);
expect(es[0].hello).to.eql("hola");
expect(es[1].goodbye).to.eql("adios");
```


## Kernel.getAllTagged<T>()
Get all available bindings for a given identifier that match the given
named constraint:
```ts
let kernel = new Kernel();

interface Intl {
hello?: string;
goodbye?: string;
}

kernel.bind<Intl>("Intl").toConstantValue({ hello: "bonjour" }).whenTargetTagged("lang", "fr");
kernel.bind<Intl>("Intl").toConstantValue({ goodbye: "au revoir" }).whenTargetTagged("lang", "fr");

kernel.bind<Intl>("Intl").toConstantValue({ hello: "hola" }).whenTargetTagged("lang", "es");
kernel.bind<Intl>("Intl").toConstantValue({ goodbye: "adios" }).whenTargetTagged("lang", "es");

let fr = kernel.getAllTagged<Intl>("Intl", "lang", "fr");
expect(fr.length).to.eql(2);
expect(fr[0].hello).to.eql("bonjour");
expect(fr[1].goodbye).to.eql("au revoir");

let es = kernel.getAllTagged<Intl>("Intl", "lang", "es");
expect(es.length).to.eql(2);
expect(es[0].hello).to.eql("hola");
expect(es[1].goodbye).to.eql("adios");
```

## Kernel.isBound()
You can use the `isBound` method to check if there are registered bindings for a given service identifier.
```ts
Expand Down

0 comments on commit 0d87faf

Please sign in to comment.