diff --git a/examples/singleton_and_factory.py b/examples/singleton_and_factory.py new file mode 100644 index 00000000..3d044608 --- /dev/null +++ b/examples/singleton_and_factory.py @@ -0,0 +1,69 @@ +"""Providers delegation example.""" + +from objects.providers import Factory +from objects.providers import Singleton + +from objects.injections import KwArg + + +class User(object): + + """Example class User.""" + + def __init__(self, id, name): + """Initializer. + + :param id: int + :param name: str + :return: + """ + self.id = id + self.name = name + + +class UserService(object): + + """Example class UserService. + + UserService has dependency on users factory. + """ + + def __init__(self, users_factory): + """Initializer. + + :param users_factory: objects.providers.Factory + :return: + """ + self.users_factory = users_factory + + def get_by_id(self, id): + """Return user info by user id.""" + return self.users_factory(id=id, name=self._get_name_from_db(id)) + + def _get_name_from_db(self, id): + """Return user's name from database by his id. + + Main purpose of this method is just to show the fact of retrieving + some user's data from database, so, actually, it simulates work + with database just by merging constant string with provided user's id. + """ + return ''.join(('user', str(id))) + + +# Users factory and UserService provider: +users_service = Singleton(UserService, + KwArg('users_factory', + Factory(User), + delegate=True)) + + +# Creating several User objects: +user1 = users_service().get_by_id(1) +user2 = users_service().get_by_id(2) + +# Making some asserts: +assert user1.id == 1 +assert user1.name == 'user1' + +assert user2.id == 2 +assert user2.name == 'user2' diff --git a/objects/injections.py b/objects/injections.py index c574071b..15d20a5c 100644 --- a/objects/injections.py +++ b/objects/injections.py @@ -8,17 +8,18 @@ class Injection(object): """Base injection class.""" __IS_OBJECTS_INJECTION__ = True - __slots__ = ('name', 'injectable') + __slots__ = ('name', 'injectable', 'delegate') - def __init__(self, name, injectable): + def __init__(self, name, injectable, delegate=False): """Initializer.""" self.name = name self.injectable = injectable + self.delegate = delegate @property def value(self): """Return injectable value.""" - if is_provider(self.injectable): + if is_provider(self.injectable) and not self.delegate: return self.injectable() return self.injectable