@@ -128,6 +128,8 @@ There are different scope which defines different ways a service is instantiated
128
128
Whenever a transient scoped provider is required, a new instance of the provider is created
129
129
130
130
``` python
131
+ # main.py
132
+
131
133
from ellar.di import EllarInjector, transient_scope, injectable
132
134
133
135
injector = EllarInjector(auto_bind = False )
@@ -141,17 +143,24 @@ injector.container.register(ATransientClass)
141
143
# OR
142
144
# injector.container.register_transient(ATransientClass)
143
145
144
- a_transient_instance_1 = injector.get(ATransientClass)
145
- a_transient_instance_2 = injector.get(ATransientClass)
146
+ def validate_transient_scope ():
147
+ a_transient_instance_1 = injector.get(ATransientClass)
148
+ a_transient_instance_2 = injector.get(ATransientClass)
149
+
150
+ assert a_transient_instance_2 != a_transient_instance_1 # True
146
151
147
- assert a_transient_instance_2 != a_transient_instance_1 # True
152
+
153
+ if __name__ == " __main__" :
154
+ validate_transient_scope()
148
155
```
149
156
150
157
### ** ` singleton_scope ` ** :
151
158
A singleton scoped provider is created once throughout the lifespan of the Container instance.
152
159
153
160
For example:
154
161
``` python
162
+ # main.py
163
+
155
164
from ellar.di import EllarInjector, singleton_scope, injectable
156
165
157
166
injector = EllarInjector(auto_bind = False )
@@ -165,18 +174,25 @@ injector.container.register(ASingletonClass)
165
174
# OR
166
175
# injector.container.register_singleton(ASingletonClass)
167
176
168
- a_singleton_instance_1 = injector.get(ASingletonClass)
169
- a_singleton_instance_2 = injector.get(ASingletonClass)
177
+ def validate_singleton_scope ():
178
+ a_singleton_instance_1 = injector.get(ASingletonClass)
179
+ a_singleton_instance_2 = injector.get(ASingletonClass)
180
+
181
+ assert a_singleton_instance_2 == a_singleton_instance_1 # True
170
182
171
- assert a_singleton_instance_2 == a_singleton_instance_1 # True
183
+ if __name__ == " __main__" :
184
+ validate_singleton_scope()
172
185
```
173
186
174
187
### ** ` request_scope ` ** :
175
188
A request scoped provider is instantiated once during the scope of the request. And it's destroyed once the request is complete.
176
189
It is important to note that ` request_scope ` behaves like a ` singleton_scope ` during HTTPConnection mode and behaves like a ` transient_scope ` outside HTTPConnection mode.
177
190
178
191
``` python
179
- from ellar.di import EllarInjector, request_scope, injectable, RequestServiceProvider
192
+ # main.py
193
+
194
+ import uvicorn
195
+ from ellar.di import EllarInjector, request_scope, injectable
180
196
181
197
injector = EllarInjector(auto_bind = False )
182
198
@@ -187,16 +203,22 @@ class ARequestScopeClass:
187
203
188
204
189
205
injector.container.register(ARequestScopeClass)
190
- request_injector = RequestServiceProvider(injector.container)
191
206
192
- request_instance_1 = request_injector.get(ARequestScopeClass)
193
- request_instance_2 = request_injector.get(ARequestScopeClass)
194
- assert request_instance_2 == request_instance_1
195
207
196
- request_instance_1 = injector.get(ARequestScopeClass)
197
- request_instance_2 = injector.get(ARequestScopeClass)
208
+ async def scoped_request (scope , receive , send ):
209
+ async with injector.create_asgi_args(scope, receive, send) as request_injector:
210
+ request_instance_1 = request_injector.get(ARequestScopeClass)
211
+ request_instance_2 = request_injector.get(ARequestScopeClass)
212
+ assert request_instance_2 == request_instance_1
213
+
214
+ request_instance_1 = injector.get(ARequestScopeClass)
215
+ request_instance_2 = injector.get(ARequestScopeClass)
216
+
217
+ assert request_instance_2 != request_instance_1
218
+
198
219
199
- assert request_instance_2 != request_instance_1
220
+ if __name__ == " __main__" :
221
+ uvicorn.run(" main:scoped_request" , port = 5000 , log_level = " info" )
200
222
201
223
```
202
224
@@ -208,6 +230,8 @@ With `ProviderConfig`, we can register a `base_type` against a `concrete_type` O
208
230
209
231
For example:
210
232
``` python
233
+ # main.py
234
+
211
235
from ellar.common import Module
212
236
from ellar.core import ModuleBase, Config
213
237
from ellar.di import ProviderConfig, injectable, EllarInjector
@@ -244,15 +268,20 @@ class AModule(ModuleBase):
244
268
self .ifoo_b = ifoo_b
245
269
246
270
247
- module_ref = create_module_ref_factor(
271
+ def validate_provider_config ():
272
+ module_ref = create_module_ref_factor(
248
273
AModule, container = injector.container, config = Config(),
249
- )
250
- module_ref.run_module_register_services()
251
- a_module_instance: AModule = injector.get(AModule)
274
+ )
275
+ module_ref.run_module_register_services()
276
+ a_module_instance: AModule = injector.get(AModule)
277
+
278
+ assert isinstance (a_module_instance.ifoo, AFooClass)
279
+ assert isinstance (a_module_instance.ifoo_b, AFooClass)
280
+ assert a_module_instance.ifoo_b == a_foo_instance
252
281
253
- assert isinstance (a_module_instance.ifoo, AFooClass)
254
- assert isinstance (a_module_instance.ifoo_b, AFooClass)
255
- assert a_module_instance.ifoo_b == a_foo_instance
282
+
283
+ if __name__ == " __main__ " :
284
+ validate_provider_config()
256
285
```
257
286
In above example, we used ` ProviderConfig ` as a value type as in the case of ` IFooB ` type and
258
287
as a concrete type as in the case of ` IFoo ` type.
@@ -262,6 +291,8 @@ We can also achieve the same by overriding `register_providers` in any Module cl
262
291
263
292
For example:
264
293
``` python
294
+ # main.py
295
+
265
296
from ellar.common import Module
266
297
from ellar.core import ModuleBase, Config
267
298
from ellar.di import Container, EllarInjector, injectable, ProviderConfig
@@ -293,15 +324,20 @@ class AModule(ModuleBase):
293
324
container.register(IFooB, a_foo_instance)
294
325
295
326
296
- module_ref = create_module_ref_factor(
327
+ def validate_register_services ():
328
+ module_ref = create_module_ref_factor(
297
329
AModule, container = injector.container, config = Config(),
298
- )
299
- module_ref.run_module_register_services()
330
+ )
331
+ module_ref.run_module_register_services()
332
+
333
+ ifoo_b = injector.get(IFooB)
334
+ ifoo = injector.get(IFoo)
335
+
336
+ assert isinstance (ifoo_b, AFooClass)
337
+ assert isinstance (ifoo, AFooClass)
338
+ assert ifoo_b == a_foo_instance
300
339
301
- ifoo_b = injector.get(IFooB)
302
- ifoo = injector.get(IFoo )
340
+ if __name__ == " __main__ " :
341
+ validate_register_services( )
303
342
304
- assert isinstance (ifoo_b, AFooClass)
305
- assert isinstance (ifoo, AFooClass)
306
- assert ifoo_b == a_foo_instance
307
343
```
0 commit comments