|
1 | 1 | import inspect |
2 | 2 |
|
3 | | -from typing import Any, Dict, Optional, TypeVar, Type |
| 3 | +from typing import Any, Dict, List, Optional, TypeVar, Type |
4 | 4 |
|
5 | 5 | from dependency_injection.registration import Registration |
6 | 6 | from dependency_injection.scope import DEFAULT_SCOPE_NAME, Scope |
@@ -29,26 +29,26 @@ def get_instance(cls, name: str=None) -> Self: |
29 | 29 |
|
30 | 30 | return cls._instances[(cls, name)] |
31 | 31 |
|
32 | | - def register_transient(self, dependency: Type, implementation: Optional[Type] = None, constructor_args: Optional[Dict[str, Any]] = None) -> None: |
| 32 | + def register_transient(self, dependency: Type, implementation: Optional[Type] = None, tags: Optional[set] = None, constructor_args: Optional[Dict[str, Any]] = None) -> None: |
33 | 33 | if implementation is None: |
34 | 34 | implementation = dependency |
35 | 35 | if dependency in self._registrations: |
36 | 36 | raise ValueError(f"Dependency {dependency} is already registered.") |
37 | | - self._registrations[dependency] = Registration(dependency, implementation, Scope.TRANSIENT, constructor_args) |
| 37 | + self._registrations[dependency] = Registration(dependency, implementation, Scope.TRANSIENT, tags, constructor_args) |
38 | 38 |
|
39 | | - def register_scoped(self, dependency: Type, implementation: Optional[Type] = None, constructor_args: Optional[Dict[str, Any]] = None) -> None: |
| 39 | + def register_scoped(self, dependency: Type, implementation: Optional[Type] = None, tags: Optional[set] = None, constructor_args: Optional[Dict[str, Any]] = None) -> None: |
40 | 40 | if implementation is None: |
41 | 41 | implementation = dependency |
42 | 42 | if dependency in self._registrations: |
43 | 43 | raise ValueError(f"Dependency {dependency} is already registered.") |
44 | | - self._registrations[dependency] = Registration(dependency, implementation, Scope.SCOPED, constructor_args) |
| 44 | + self._registrations[dependency] = Registration(dependency, implementation, Scope.SCOPED, tags, constructor_args) |
45 | 45 |
|
46 | | - def register_singleton(self, dependency: Type, implementation: Optional[Type] = None, constructor_args: Optional[Dict[str, Any]] = None) -> None: |
| 46 | + def register_singleton(self, dependency: Type, implementation: Optional[Type] = None, tags: Optional[set] = None, constructor_args: Optional[Dict[str, Any]] = None) -> None: |
47 | 47 | if implementation is None: |
48 | 48 | implementation = dependency |
49 | 49 | if dependency in self._registrations: |
50 | 50 | raise ValueError(f"Dependency {dependency} is already registered.") |
51 | | - self._registrations[dependency] = Registration(dependency, implementation, Scope.SINGLETON, constructor_args) |
| 51 | + self._registrations[dependency] = Registration(dependency, implementation, Scope.SINGLETON, tags, constructor_args) |
52 | 52 |
|
53 | 53 | def resolve(self, dependency: Type, scope_name: str = DEFAULT_SCOPE_NAME) -> Type: |
54 | 54 | if scope_name not in self._scoped_instances: |
@@ -90,6 +90,15 @@ def resolve(self, dependency: Type, scope_name: str = DEFAULT_SCOPE_NAME) -> Typ |
90 | 90 |
|
91 | 91 | raise ValueError(f"Invalid dependency scope: {scope}") |
92 | 92 |
|
| 93 | + def resolve_all(self, tags: Optional[set] = None) -> List[Any]: |
| 94 | + tags = [] if not tags else tags |
| 95 | + resolved_dependencies = [] |
| 96 | + for registration in self._registrations.values(): |
| 97 | + if not len(tags) or tags.intersection(registration.tags): |
| 98 | + resolved_dependencies.append( |
| 99 | + self.resolve(registration.dependency)) |
| 100 | + return resolved_dependencies |
| 101 | + |
93 | 102 | def _validate_constructor_args(self, constructor_args: Dict[str, Any], implementation: Type) -> None: |
94 | 103 | constructor = inspect.signature(implementation.__init__).parameters |
95 | 104 |
|
|
0 commit comments