diff --git a/docs/providers/singleton.rst b/docs/providers/singleton.rst index a3cc2d4d..c42b6a3e 100644 --- a/docs/providers/singleton.rst +++ b/docs/providers/singleton.rst @@ -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 ------------------- diff --git a/examples/providers/singleton.py b/examples/providers/singleton.py index 9e94b76c..f1083895 100644 --- a/examples/providers/singleton.py +++ b/examples/providers/singleton.py @@ -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 diff --git a/examples/providers/singleton_resetting.py b/examples/providers/singleton_resetting.py index edec0594..7188744b 100644 --- a/examples/providers/singleton_resetting.py +++ b/examples/providers/singleton_resetting.py @@ -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 diff --git a/examples/providers/singleton_scoped.py b/examples/providers/singleton_scoped.py index e9bc2ea6..0d40a6e7 100644 --- a/examples/providers/singleton_scoped.py +++ b/examples/providers/singleton_scoped.py @@ -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) diff --git a/examples/providers/singleton_thread_locals.py b/examples/providers/singleton_thread_locals.py index 83325559..1255d718 100644 --- a/examples/providers/singleton_thread_locals.py +++ b/examples/providers/singleton_thread_locals.py @@ -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.