Add container usage for all singleton provider examples

This commit is contained in:
Roman Mogylatov 2020-09-03 16:56:01 -04:00
parent a7afa66e40
commit 1eb9020a4e
5 changed files with 55 additions and 34 deletions

View File

@ -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
-------------------

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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.