I have a react-native application frontend using inversify-js.
I've structured some service classes to use IOC (using an inversify container), such services intended to be shared as just one singleton instances among other services. They have an init/destroy method to help to clear up the services' internal state.
The init/destroy mechanism works fine but on top of that, it would be nice to have a way to "clear" the inversify container singletons, to rebuild all my singleton services from scratch.
Example:
src/services/A.ts
@injectable()
export class A extends Service {
constructor() {
super();
}
init() {
super.init();
// [...] Initialize A's state
}
destroy() {
// [...] Destroy A's state
super.destroy();
}
method() {
// [...] Provide functionality to other services (maintaining A's state)
}
}
src/services/B.ts
@injectable()
export class B extends Service {
constructor(
b: B // receive injected instance of service A using constructor injection (inversify)
) {
super();
}
init() {
super.init();
// [...] Initialize B's state
}
destroy() {
// [...] Destroy B's state
super.destroy();
}
method() {
// [...] Provide functionality to other services (maintaining B's state, using also service A)
this.a.method();
}
}
src/inversify/container.ts
export const containerModule = new ContainerModule((bind) => {
// Services
bind<A>(A).toSelf().inSingletonScope();
bind<B>(B).toSelf().inSingletonScope();
});
const container = new Container();
container.load(containerModule);
export default container;
index.ts
let a = container.get<A>(A);
let b = container.get<A>(B);
// [...] use services
// Destroy services (es: logout/reload app)
a.destroy();
b.destroy();
// Here I'd also like to "reset" the container
// container.reset(); // like this?
// [...] After some time (maybe login again?)
// I'd like these two to be new singleton instances (!== from previous a,b)
a = container.get<A>(A);
b = container.get<A>(B);
I should be able to maybe "unload" the ContainerModule from the Container (container.unload(containerModule)
) and "load" it again? Seems hacky though, I was looking for comparable solutions.
I looked into this question but, in the end, didn't need the same "reset" functionality anyway: Reset scoped container in inversifyjs