@@ -73,32 +73,44 @@ class InjectableBroker[T](Protocol):
7373 def get (self , provider : InjectionProvider ) -> Injectable [T ] | None :
7474 raise NotImplementedError
7575
76+ @abstractmethod
77+ def is_locked (self , provider : InjectionProvider ) -> bool :
78+ raise NotImplementedError
79+
7680 @abstractmethod
7781 def request (self , provider : InjectionProvider ) -> Injectable [T ]:
7882 raise NotImplementedError
7983
8084
8185@dataclass (repr = False , eq = False , frozen = True , slots = True )
8286class DynamicInjectableBroker [T ](InjectableBroker [T ]):
83- injectable_factory : InjectableFactory [T ]
87+ factory : InjectableFactory [T ]
8488 recipe : Recipe [..., T ]
85- cache : WeakKeyDictionary [InjectionProvider , Injectable [T ]] = field (
89+ injectables : WeakKeyDictionary [InjectionProvider , Injectable [T ]] = field (
8690 default_factory = WeakKeyDictionary ,
8791 init = False ,
8892 )
8993
9094 def get (self , provider : InjectionProvider ) -> Injectable [T ] | None :
91- return self .cache .get (provider )
95+ return self .injectables .get (provider )
96+
97+ def is_locked (self , provider : InjectionProvider ) -> bool :
98+ injectable = self .get (provider )
99+
100+ if injectable is None :
101+ return False
102+
103+ return injectable .is_locked
92104
93105 def request (self , provider : InjectionProvider ) -> Injectable [T ]:
94106 with suppress (KeyError ):
95- return self .cache [provider ]
107+ return self .injectables [provider ]
96108
97109 injectable = _make_injectable (
98- self .injectable_factory ,
110+ self .factory ,
99111 provider .make_injected_function (self .recipe ), # type: ignore[misc]
100112 )
101- self .cache [provider ] = injectable
113+ self .injectables [provider ] = injectable
102114 return injectable
103115
104116
@@ -109,16 +121,19 @@ class StaticInjectableBroker[T](InjectableBroker[T]):
109121 def get (self , provider : InjectionProvider ) -> Injectable [T ] | None :
110122 return self .value
111123
124+ def is_locked (self , provider : InjectionProvider ) -> bool :
125+ return False
126+
112127 def request (self , provider : InjectionProvider ) -> Injectable [T ]:
113128 return self .value
114129
115130 @classmethod
116131 def from_factory (
117132 cls ,
118- injectable_factory : InjectableFactory [T ],
133+ factory : InjectableFactory [T ],
119134 recipe : Recipe [..., T ],
120135 ) -> Self :
121- return cls (_make_injectable (injectable_factory , recipe ))
136+ return cls (_make_injectable (factory , recipe ))
122137
123138
124139class Mode (StrEnum ):
@@ -172,9 +187,7 @@ def __brokers(self) -> frozenset[InjectableBroker[Any]]:
172187 return frozenset (record .broker for record in self .__records .values ())
173188
174189 def is_locked (self , provider : InjectionProvider ) -> bool :
175- return any (
176- injectable .is_locked for injectable in self .__iter_injectables (provider )
177- )
190+ return any (broker .is_locked (provider ) for broker in self .__brokers )
178191
179192 def request [T ](
180193 self ,
0 commit comments