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
|
.. 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
|
||||||
-------------------
|
-------------------
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue
Block a user