A minimal reproducible demo:
import React, {Fragment, FunctionComponent} from 'react';
import {render} from 'react-dom';
import {provider, inject, toClass, toFactory, useInstance} from 'react-ioc';
class ServiceB {
bar(): string {
return 'bar';
}
}
class ServiceA {
@inject serviceB: ServiceB;
foo(): string {
return 'foo' + this.serviceB.bar();
}
}
const bindings = [
[ServiceB, toClass(ServiceB)],
[ServiceA, toFactory(() => new ServiceA())]
];
const Provider = provider(...bindings)(Fragment);
const App: FunctionComponent = () => {
const serviceA = useInstance(ServiceA);
return <span>{serviceA.foo()}</span>;
};
render(<Provider><App /></Provider>, document.body);
Here we expect foobar in the document body, but instead get Dependency ServiceB is not found and TypeError: Cannot read property 'bar' of undefined respectively. But if change toFactory(() => new ServiceB()) to toClass(ServiceB) (or simple ServiceB but I prefer to pass binding explicitly) everything works fine.
Looks like saving the injector to an instance is implemented only in toClass binding, is it by design? Maybe we can lift it up to asBinding utility? BTW it still work if serviceB is accessed (or injected directly) during instantiating of ServiceA by saving the injector to currentInjector variable under the hood:
class ServiceA {
@inject serviceB: ServiceB;
constructor() {
this.serviceB;
}
foo(): string {
return 'foo' + this.serviceB.bar();
}
}
A minimal reproducible demo:
Here we expect
foobarin the document body, but instead getDependency ServiceB is not foundandTypeError: Cannot read property 'bar' of undefinedrespectively. But if changetoFactory(() => new ServiceB())totoClass(ServiceB)(or simpleServiceBbut I prefer to pass binding explicitly) everything works fine.Looks like saving the injector to an instance is implemented only in
toClassbinding, is it by design? Maybe we can lift it up toasBindingutility? BTW it still work if serviceB is accessed (or injected directly) during instantiating ofServiceAby saving the injector tocurrentInjectorvariable under the hood: