inversify / InversifyJS

A powerful and lightweight inversion of control container for JavaScript & Node.js apps powered by TypeScript.
http://inversify.io/
MIT License
11.02k stars 712 forks source link

Moving from Symbol.for() to Symbol() doesn't resolve dependencies correctly #1559

Open Rmonik opened 5 months ago

Rmonik commented 5 months ago

Given that you use a global object which holds Symbol("Something") values and having bound a class to that identifier. If I try to get that identifier from the container, i get a "No bindings found" error. When changing the Symbol to a Symbol.for, this issue is not present.

Expected Behavior

Symbol() should work just as well as Symbol.for.

Current Behavior

Using a Symbol() doesn't correctly resolve dependencies.

Possible Solution

Steps to Reproduce (for bugs)

  1. Create a constant: const a = Symbol("a");
  2. Bind something to it: container.bind(a).to(MyClass);
  3. Get it from the container: container.getAsync(a);
  4. Error: No matching bindings found for Symbol(a)

Context

I would like to use true Symbols (as opposed to Symbol.for, which i don't see the point in using) as we're facing naming collisions.

Your Environment

Stack trace

saifeiLee commented 5 months ago

I cannot reproduce this issue. The test case i use:

import { expect } from "chai";
import { Container } from "../../src/inversify";
import { injectable } from "../../src/annotation/injectable";
@injectable()
class World {
  hello() {
    return "Hello World!";
  }
}

describe("Symbol binding", () => {
  it("Should support Symbol() as service identifier", () => {
    const fooIdentifier = Symbol("FooInterface");
    const container = new Container();
    container.bind(fooIdentifier).to(World);
    container.getAsync(fooIdentifier).then((foo: any) => {
      foo.hello();
    });
    expect(container.get(fooIdentifier)).to.be.instanceof(World);
  });
});

Version: 6.02