mirror of
https://github.com/ets-labs/python-dependency-injector.git
synced 2025-02-07 07:00:49 +03:00
Add container usage for all singleton provider examples
This commit is contained in:
parent
a7afa66e40
commit
1eb9020a4e
|
@ -41,7 +41,7 @@ provider.
|
|||
.. literalinclude:: ../../examples/providers/singleton_resetting.py
|
||||
:language: python
|
||||
:lines: 3-
|
||||
:emphasize-lines: 14
|
||||
:emphasize-lines: 18
|
||||
|
||||
.. note::
|
||||
Resetting of the memorized object clears the reference to it. Further object's lifecycle is
|
||||
|
@ -64,7 +64,7 @@ There are two thread-safe singleton implementations out of the box:
|
|||
.. literalinclude:: ../../examples/providers/singleton_thread_locals.py
|
||||
:language: python
|
||||
:lines: 3-
|
||||
:emphasize-lines: 11,12
|
||||
:emphasize-lines: 13,15
|
||||
|
||||
Implementing scopes
|
||||
-------------------
|
||||
|
|
|
@ -1,16 +1,20 @@
|
|||
"""`Singleton` provider example."""
|
||||
|
||||
from dependency_injector import providers
|
||||
from dependency_injector import containers, providers
|
||||
|
||||
|
||||
class UserService:
|
||||
...
|
||||
|
||||
|
||||
user_service_provider = providers.Singleton(UserService)
|
||||
class Container(containers.DeclarativeContainer):
|
||||
|
||||
user_service_provider = providers.Singleton(UserService)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
user_service1 = user_service_provider()
|
||||
user_service2 = user_service_provider()
|
||||
container = Container()
|
||||
|
||||
user_service1 = container.user_service_provider()
|
||||
user_service2 = container.user_service_provider()
|
||||
assert user_service1 is user_service2
|
||||
|
|
|
@ -1,19 +1,23 @@
|
|||
"""`Singleton` provider resetting example."""
|
||||
|
||||
from dependency_injector import providers
|
||||
from dependency_injector import containers, providers
|
||||
|
||||
|
||||
class UserService:
|
||||
...
|
||||
|
||||
|
||||
user_service_provider = providers.Singleton(UserService)
|
||||
class Container(containers.DeclarativeContainer):
|
||||
|
||||
user_service_provider = providers.Singleton(UserService)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
user_service1 = user_service_provider()
|
||||
container = Container()
|
||||
|
||||
user_service_provider.reset()
|
||||
user_service1 = container.user_service_provider()
|
||||
|
||||
users_service2 = user_service_provider()
|
||||
container.user_service_provider.reset()
|
||||
|
||||
users_service2 = container.user_service_provider()
|
||||
assert users_service2 is not user_service1
|
||||
|
|
|
@ -1,30 +1,35 @@
|
|||
"""`Singleton` - Flask request scope example."""
|
||||
|
||||
from dependency_injector import providers
|
||||
from flask import Flask
|
||||
from dependency_injector import containers, providers
|
||||
from flask import Flask, current_app
|
||||
|
||||
|
||||
class Service:
|
||||
...
|
||||
|
||||
|
||||
service_provider = providers.Singleton(Service)
|
||||
class Container(containers.DeclarativeContainer):
|
||||
|
||||
service_provider = providers.Singleton(Service)
|
||||
|
||||
|
||||
def index_view():
|
||||
service_1 = service_provider()
|
||||
service_2 = service_provider()
|
||||
service_1 = current_app.container.service_provider()
|
||||
service_2 = current_app.container.service_provider()
|
||||
assert service_1 is service_2
|
||||
print(service_1)
|
||||
return 'Hello World!'
|
||||
|
||||
|
||||
def teardown_context(request):
|
||||
service_provider.reset()
|
||||
current_app.container.service_provider.reset()
|
||||
return request
|
||||
|
||||
|
||||
container = Container()
|
||||
|
||||
app = Flask(__name__)
|
||||
app.container = container
|
||||
app.add_url_rule('/', 'index', view_func=index_view)
|
||||
app.after_request(teardown_context)
|
||||
|
||||
|
|
|
@ -3,31 +3,39 @@
|
|||
import threading
|
||||
import queue
|
||||
|
||||
from dependency_injector import providers
|
||||
from dependency_injector import containers, providers
|
||||
|
||||
|
||||
def put_in_queue(example_object, queue_object):
|
||||
queue_object.put(example_object)
|
||||
|
||||
|
||||
thread_local_object = providers.ThreadLocalSingleton(object)
|
||||
queue_provider = providers.ThreadSafeSingleton(queue.Queue)
|
||||
put_in_queue = providers.Callable(
|
||||
put_in_queue,
|
||||
example_object=thread_local_object,
|
||||
queue_object=queue_provider,
|
||||
)
|
||||
thread_factory = providers.Factory(
|
||||
threading.Thread,
|
||||
target=put_in_queue.provider,
|
||||
)
|
||||
class Container(containers.DeclarativeContainer):
|
||||
|
||||
thread_local_object = providers.ThreadLocalSingleton(object)
|
||||
|
||||
queue_provider = providers.ThreadSafeSingleton(queue.Queue)
|
||||
|
||||
put_in_queue = providers.Callable(
|
||||
put_in_queue,
|
||||
example_object=thread_local_object,
|
||||
queue_object=queue_provider,
|
||||
)
|
||||
|
||||
thread_factory = providers.Factory(
|
||||
threading.Thread,
|
||||
target=put_in_queue.provider,
|
||||
)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
container = Container()
|
||||
|
||||
n = 10
|
||||
threads = []
|
||||
for thread_number in range(10):
|
||||
for thread_number in range(n):
|
||||
threads.append(
|
||||
thread_factory(name='Thread{0}'.format(thread_number)),
|
||||
container.thread_factory(name='Thread{0}'.format(thread_number)),
|
||||
)
|
||||
for thread in threads:
|
||||
thread.start()
|
||||
|
@ -35,9 +43,9 @@ if __name__ == '__main__':
|
|||
thread.join()
|
||||
|
||||
all_objects = set()
|
||||
while not queue_provider().empty():
|
||||
all_objects.add(queue_provider().get())
|
||||
while not container.queue_provider().empty():
|
||||
all_objects.add(container.queue_provider().get())
|
||||
|
||||
assert len(all_objects) == len(threads)
|
||||
assert len(all_objects) == len(threads) == n
|
||||
# Queue contains same number of objects as number of threads where
|
||||
# thread-local singleton provider was used.
|
||||
|
|
Loading…
Reference in New Issue
Block a user