Adding delegate option for injections

This commit is contained in:
Roman Mogilatov 2015-07-11 17:21:36 +03:00
parent 77f5d05071
commit 4620ad7f29
2 changed files with 73 additions and 3 deletions

View File

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

View File

@ -8,17 +8,18 @@ class Injection(object):
"""Base injection class.""" """Base injection class."""
__IS_OBJECTS_INJECTION__ = True __IS_OBJECTS_INJECTION__ = True
__slots__ = ('name', 'injectable') __slots__ = ('name', 'injectable', 'delegate')
def __init__(self, name, injectable): def __init__(self, name, injectable, delegate=False):
"""Initializer.""" """Initializer."""
self.name = name self.name = name
self.injectable = injectable self.injectable = injectable
self.delegate = delegate
@property @property
def value(self): def value(self):
"""Return injectable value.""" """Return injectable value."""
if is_provider(self.injectable): if is_provider(self.injectable) and not self.delegate:
return self.injectable() return self.injectable()
return self.injectable return self.injectable