diff --git a/src/container/container.ts b/src/container/container.ts index 478ad5b35..dbd425619 100644 --- a/src/container/container.ts +++ b/src/container/container.ts @@ -138,8 +138,8 @@ class Container implements interfaces.Container { containerModuleHelpers.isboundFunction, containerModuleHelpers.rebindFunction, containerModuleHelpers.unbindAsyncFunction, - containerModuleHelpers.onActivationFunction as interfaces.Container['onActivation'], - containerModuleHelpers.onDeactivationFunction as interfaces.Container['onDeactivation'], + containerModuleHelpers.onActivationFunction, + containerModuleHelpers.onDeactivationFunction, ); } } @@ -192,11 +192,7 @@ class Container implements interfaces.Container { public bind( serviceIdentifier: interfaces.ServiceIdentifier, ): interfaces.BindingToSyntax { - const scope: interfaces.BindingScope = - this.options.defaultScope || BindingScopeEnum.Transient; - const binding: Binding = new Binding(serviceIdentifier, scope); - this._bindingDictionary.add(serviceIdentifier, binding as Binding); - return new BindingToSyntax(binding); + return this._bind(this._buildBinding(serviceIdentifier)); } public rebind( @@ -684,32 +680,15 @@ class Container implements interfaces.Container { } private _getContainerModuleHelpersFactory() { - const setModuleId: ( - bindingToSyntax: interfaces.BindingToSyntax, - moduleId: interfaces.ContainerModuleBase['id'], - ) => void = ( - bindingToSyntax: interfaces.BindingToSyntax, - moduleId: interfaces.ContainerModuleBase['id'], - ) => { - // TODO: Implement an internal type `_BindingToSyntax` wherein this member - // can be public. Let `BindingToSyntax` be the presentational type that - // depends on it, and does not expose this member as public. - ( - bindingToSyntax as unknown as { - _binding: { moduleId: interfaces.ContainerModuleBase['id'] }; - } - )._binding.moduleId = moduleId; - }; - const getBindFunction: ( moduleId: interfaces.ContainerModuleBase['id'], ) => interfaces.Bind = (moduleId: interfaces.ContainerModuleBase['id']) => (serviceIdentifier: interfaces.ServiceIdentifier) => { - const bindingToSyntax: interfaces.BindingToSyntax = - this.bind(serviceIdentifier); - setModuleId(bindingToSyntax, moduleId); - return bindingToSyntax; + const binding: Binding = this._buildBinding(serviceIdentifier); + binding.moduleId = moduleId; + + return this._bind(binding); }; const getUnbindFunction: () => ( @@ -738,25 +717,29 @@ class Container implements interfaces.Container { const getRebindFunction: ( moduleId: interfaces.ContainerModuleBase['id'], - ) => interfaces.Rebind = - (moduleId: interfaces.ContainerModuleBase['id']) => - (serviceIdentifier: interfaces.ServiceIdentifier) => { - const bindingToSyntax: interfaces.BindingToSyntax = - this.rebind(serviceIdentifier); - setModuleId(bindingToSyntax, moduleId); - return bindingToSyntax; + ) => interfaces.Rebind = ( + moduleId: interfaces.ContainerModuleBase['id'], + ) => { + const bind: interfaces.Bind = getBindFunction(moduleId); + + return ( + serviceIdentifier: interfaces.ServiceIdentifier, + ) => { + this.unbind(serviceIdentifier); + return bind(serviceIdentifier); }; + }; const getOnActivationFunction: ( moduleId: interfaces.ContainerModuleBase['id'], - ) => ( - serviceIdentifier: interfaces.ServiceIdentifier, - onActivation: interfaces.BindingActivation, + ) => ( + serviceIdentifier: interfaces.ServiceIdentifier, + onActivation: interfaces.BindingActivation, ) => void = (moduleId: interfaces.ContainerModuleBase['id']) => - ( - serviceIdentifier: interfaces.ServiceIdentifier, - onActivation: interfaces.BindingActivation, + ( + serviceIdentifier: interfaces.ServiceIdentifier, + onActivation: interfaces.BindingActivation, ) => { this._moduleActivationStore.addActivation( moduleId, @@ -768,14 +751,14 @@ class Container implements interfaces.Container { const getOnDeactivationFunction: ( moduleId: interfaces.ContainerModuleBase['id'], - ) => ( - serviceIdentifier: interfaces.ServiceIdentifier, - onDeactivation: interfaces.BindingDeactivation, + ) => ( + serviceIdentifier: interfaces.ServiceIdentifier, + onDeactivation: interfaces.BindingDeactivation, ) => void = (moduleId: interfaces.ContainerModuleBase['id']) => - ( - serviceIdentifier: interfaces.ServiceIdentifier, - onDeactivation: interfaces.BindingDeactivation, + ( + serviceIdentifier: interfaces.ServiceIdentifier, + onDeactivation: interfaces.BindingDeactivation, ) => { this._moduleActivationStore.addDeactivation( moduleId, @@ -795,6 +778,23 @@ class Container implements interfaces.Container { unbindFunction: getUnbindFunction(), }); } + + private _bind(binding: Binding): BindingToSyntax { + this._bindingDictionary.add( + binding.serviceIdentifier, + binding as Binding, + ); + return new BindingToSyntax(binding); + } + + private _buildBinding( + serviceIdentifier: interfaces.ServiceIdentifier, + ): Binding { + const scope: interfaces.BindingScope = + this.options.defaultScope || BindingScopeEnum.Transient; + return new Binding(serviceIdentifier, scope); + } + private async _getAll(getArgs: GetArgs): Promise { return Promise.all(this._get(getArgs) as (Promise | T)[]); } diff --git a/src/container/module_activation_store.ts b/src/container/module_activation_store.ts index 2f0d87118..e5369107a 100644 --- a/src/container/module_activation_store.ts +++ b/src/container/module_activation_store.ts @@ -18,25 +18,25 @@ export class ModuleActivationStore implements interfaces.ModuleActivationStore { return handlers; } - public addDeactivation( + public addDeactivation( moduleId: number, - serviceIdentifier: interfaces.ServiceIdentifier, - onDeactivation: interfaces.BindingDeactivation, + serviceIdentifier: interfaces.ServiceIdentifier, + onDeactivation: interfaces.BindingDeactivation, ) { this._getModuleActivationHandlers(moduleId).onDeactivations.add( serviceIdentifier, - onDeactivation, + onDeactivation as interfaces.BindingDeactivation, ); } - public addActivation( + public addActivation( moduleId: number, - serviceIdentifier: interfaces.ServiceIdentifier, - onActivation: interfaces.BindingActivation, + serviceIdentifier: interfaces.ServiceIdentifier, + onActivation: interfaces.BindingActivation, ) { this._getModuleActivationHandlers(moduleId).onActivations.add( serviceIdentifier, - onActivation, + onActivation as interfaces.BindingActivation, ); } diff --git a/src/interfaces/interfaces.ts b/src/interfaces/interfaces.ts index e8424ce36..e15a9b908 100644 --- a/src/interfaces/interfaces.ts +++ b/src/interfaces/interfaces.ts @@ -340,15 +340,15 @@ namespace interfaces { export interface ModuleActivationStore extends Clonable { - addDeactivation( + addDeactivation( moduleId: ContainerModuleBase['id'], - serviceIdentifier: ServiceIdentifier, - onDeactivation: interfaces.BindingDeactivation, + serviceIdentifier: ServiceIdentifier, + onDeactivation: interfaces.BindingDeactivation, ): void; - addActivation( + addActivation( moduleId: ContainerModuleBase['id'], - serviceIdentifier: ServiceIdentifier, - onActivation: interfaces.BindingActivation, + serviceIdentifier: ServiceIdentifier, + onActivation: interfaces.BindingActivation, ): void; remove(moduleId: ContainerModuleBase['id']): ModuleActivationHandlers; }