InversifyJS icon indicating copy to clipboard operation
InversifyJS copied to clipboard

getNamed returns all identified items

Open nightnei opened this issue 4 years ago • 1 comments

If I add whenTargetNamed only to one ServiceIdentifier, then getNamed and getAllNamed work incorrectly.

bind('serviceId').to(somethingXXX).whenTargetNamed('serviceName');
bind('serviceId').to(somethingYYY);

Expected Behavior

container.getNamed('serviceId', 'serviceName'); // returns - somethingXXX
container.getAllNamed('serviceId', 'serviceName'); // returns - [somethingXXX]

Current Behavior

container.getNamed('serviceId', 'serviceName'); // Ambiguous match found for serviceIdentifier: serviceId
container.getAllNamed('serviceId', 'serviceName'); // [somethingXXX, somethingYYY]

Context

I need to receive either all items with serviceId or someone specific(serviceName). Current behaviour confuses me.

  1. Is it wot correctly?
  2. can I set some additional identifier to item?

BTW isBoundNamed works correctly as expected.

container.isBoundNamed('serviceId', 'serviceName')

Your Environment

Inversify 5.0.1 Chrome 95

nightnei avatar Nov 01 '21 13:11 nightnei

You need to add .whenTargetIsDefault() to your un-named bind when using named bindings:

> c.bind("1").toConstantValue("1").whenTargetNamed("numeric")
> c.bind("1").toConstantValue("one").whenTargetIsDefault()
> c.get("1")
'one'
> c.getNamed("1", "numeric")
'1'
> c.getAllNamed("1", "numeric")
[ '1' ]

kyle-johnson avatar Jan 17 '22 19:01 kyle-johnson