1717from ellar .core .conf import Config
1818from ellar .core .modules .base import ModuleBase , ModuleBaseMeta
1919from ellar .core .modules .ref .context import ModuleExecutionContext
20+ from ellar .core .modules .ref .forward import ModuleForwardRef
2021from ellar .core .router_builders import get_controller_builder_factory
2122from ellar .core .routing import EllarControllerMount , RouteOperationBase
2223from ellar .di import (
@@ -69,6 +70,9 @@ def __init__(
6970 def __repr__ (self ) -> str :
7071 return f"<{ self .__class__ .__name__ } name={ self .name } module={ self .module } >"
7172
73+ def __hash__ (self ) -> int :
74+ return hash (self .module )
75+
7276 @cached_property
7377 def module_context (self ) -> ModuleExecutionContext :
7478 return ModuleExecutionContext (container = self .container , module = self .module )
@@ -154,15 +158,28 @@ def initiate_module_build(self) -> None:
154158
155159 def run_module_register_services (self ) -> None :
156160 """
157- Defer module instantiation till lifespan call
161+ Defer module instantiation till lifespan/modules ready call
158162 """
163+ from ellar .core .modules .config import ForwardRefModule
164+
159165 _module_type_instance = self .get_module_instance ()
160166 self .container .install (_module_type_instance ) # support for injector module
161167 # _module_type_instance.register_services(self.container)
162168 modules = list (self .tree_manager .get_module_dependencies (self .module ))
169+
163170 for module_config in reversed (modules ):
171+ if isinstance (module_config .value , ModuleForwardRef ):
172+ continue
164173 module_config .value .run_module_register_services ()
165174
175+ registered_modules = (
176+ reflect .get_metadata (MODULE_METADATA .MODULES , self .module ) or []
177+ )
178+
179+ for module in registered_modules :
180+ if isinstance (module , ForwardRefModule ):
181+ module .resolve_module_dependency (self )
182+
166183 @abstractmethod
167184 def _register_module (self ) -> None :
168185 """Register Module"""
@@ -247,8 +264,6 @@ def build_controllers_and_routers(self) -> None:
247264 self ._search_providers_and_build_controller (_routers )
248265
249266 def _build_module_parameters_and_routes (self ) -> None :
250- from ellar .core .modules .config import ForwardRefModule
251-
252267 if reflect .get_metadata (MODULE_WATERMARK , self .module ):
253268 _providers = list (
254269 reflect .get_metadata (MODULE_METADATA .PROVIDERS , self .module ) or []
@@ -258,8 +273,6 @@ def _build_module_parameters_and_routes(self) -> None:
258273 reflect .get_metadata (MODULE_METADATA .EXPORTS , self .module ) or []
259274 )
260275
261- modules = reflect .get_metadata (MODULE_METADATA .MODULES , self .module ) or []
262-
263276 self .build_controllers_and_routers ()
264277
265278 for provider in _providers :
@@ -268,10 +281,6 @@ def _build_module_parameters_and_routes(self) -> None:
268281 for export in _exports :
269282 self .add_exports (export )
270283
271- for module in modules :
272- if isinstance (module , ForwardRefModule ):
273- module .resolve_module_dependency (self )
274-
275284 def _search_providers_and_build_controller (
276285 self , controllers : t .List [t .Union [t .Type , t .Any ]]
277286 ) -> None :
0 commit comments