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 .. literalinclude:: ../../examples/providers/singleton_resetting.py
:language: python :language: python
:lines: 3- :lines: 3-
:emphasize-lines: 14 :emphasize-lines: 18
.. note:: .. note::
Resetting of the memorized object clears the reference to it. Further object's lifecycle is 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 .. literalinclude:: ../../examples/providers/singleton_thread_locals.py
:language: python :language: python
:lines: 3- :lines: 3-
:emphasize-lines: 11,12 :emphasize-lines: 13,15
Implementing scopes Implementing scopes
------------------- -------------------

View File

@ -1,16 +1,20 @@
"""`Singleton` provider example.""" """`Singleton` provider example."""
from dependency_injector import providers from dependency_injector import containers, providers
class UserService: class UserService:
... ...
user_service_provider = providers.Singleton(UserService) class Container(containers.DeclarativeContainer):
user_service_provider = providers.Singleton(UserService)
if __name__ == '__main__': if __name__ == '__main__':
user_service1 = user_service_provider() container = Container()
user_service2 = user_service_provider()
user_service1 = container.user_service_provider()
user_service2 = container.user_service_provider()
assert user_service1 is user_service2 assert user_service1 is user_service2

View File

@ -1,19 +1,23 @@
"""`Singleton` provider resetting example.""" """`Singleton` provider resetting example."""
from dependency_injector import providers from dependency_injector import containers, providers
class UserService: class UserService:
... ...
user_service_provider = providers.Singleton(UserService) class Container(containers.DeclarativeContainer):
user_service_provider = providers.Singleton(UserService)
if __name__ == '__main__': 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 assert users_service2 is not user_service1

View File

@ -1,30 +1,35 @@
"""`Singleton` - Flask request scope example.""" """`Singleton` - Flask request scope example."""
from dependency_injector import providers from dependency_injector import containers, providers
from flask import Flask from flask import Flask, current_app
class Service: class Service:
... ...
service_provider = providers.Singleton(Service) class Container(containers.DeclarativeContainer):
service_provider = providers.Singleton(Service)
def index_view(): def index_view():
service_1 = service_provider() service_1 = current_app.container.service_provider()
service_2 = service_provider() service_2 = current_app.container.service_provider()
assert service_1 is service_2 assert service_1 is service_2
print(service_1) print(service_1)
return 'Hello World!' return 'Hello World!'
def teardown_context(request): def teardown_context(request):
service_provider.reset() current_app.container.service_provider.reset()
return request return request
container = Container()
app = Flask(__name__) app = Flask(__name__)
app.container = container
app.add_url_rule('/', 'index', view_func=index_view) app.add_url_rule('/', 'index', view_func=index_view)
app.after_request(teardown_context) app.after_request(teardown_context)

View File

@ -3,31 +3,39 @@
import threading import threading
import queue import queue
from dependency_injector import providers from dependency_injector import containers, providers
def put_in_queue(example_object, queue_object): def put_in_queue(example_object, queue_object):
queue_object.put(example_object) queue_object.put(example_object)
thread_local_object = providers.ThreadLocalSingleton(object) class Container(containers.DeclarativeContainer):
queue_provider = providers.ThreadSafeSingleton(queue.Queue)
put_in_queue = providers.Callable( thread_local_object = providers.ThreadLocalSingleton(object)
put_in_queue,
example_object=thread_local_object, queue_provider = providers.ThreadSafeSingleton(queue.Queue)
queue_object=queue_provider,
) put_in_queue = providers.Callable(
thread_factory = providers.Factory( put_in_queue,
threading.Thread, example_object=thread_local_object,
target=put_in_queue.provider, queue_object=queue_provider,
) )
thread_factory = providers.Factory(
threading.Thread,
target=put_in_queue.provider,
)
if __name__ == '__main__': if __name__ == '__main__':
container = Container()
n = 10
threads = [] threads = []
for thread_number in range(10): for thread_number in range(n):
threads.append( threads.append(
thread_factory(name='Thread{0}'.format(thread_number)), container.thread_factory(name='Thread{0}'.format(thread_number)),
) )
for thread in threads: for thread in threads:
thread.start() thread.start()
@ -35,9 +43,9 @@ if __name__ == '__main__':
thread.join() thread.join()
all_objects = set() all_objects = set()
while not queue_provider().empty(): while not container.queue_provider().empty():
all_objects.add(queue_provider().get()) 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 # Queue contains same number of objects as number of threads where
# thread-local singleton provider was used. # thread-local singleton provider was used.