Last active
October 20, 2015 21:16
-
-
Save blaix/cf5b7daef08462ca1bea to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# dumb example object with no dependencies: | |
class Printer(object): | |
def println(self, message): | |
print message | |
# dumb example object with dependencies: | |
class Greeter(object): | |
# can't use it without deciding on a printer | |
# (forced dependency inversion) | |
def __init__(self, printer): | |
self.printer = printer | |
def say(self, msg): | |
self.printer.println(msg) | |
printer = Printer() | |
# explicitly resolve dependencies through the constructor: | |
greeter = Greeter(printer=printer) | |
test_greeter = Greeter(printer=Mock()) | |
# If you are at the point that doing it by hand in production code is cumbersome | |
# or results in a duplicated knowledge - assuming a refactoring isn't the right solution | |
# to that problem - I like to use an explicit container that doesn't do any magic: | |
class Context(object): | |
objects = {} | |
@classmethod | |
def register(cls, name, object): | |
cls.objects[name] = object | |
@classmethod | |
def get(cls, name): | |
return cls.objects[name] | |
Context.register('printer', printer) | |
Context.register('greeter', greeter) | |
greeter_with_default_deps = Context.get('greeter') |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Context(object): | |
"""Factory for getting objects with default deps.""" | |
@property | |
def printer(self): | |
return Printer() | |
@property | |
def greeter(self, **kwargs): | |
kwargs.setdefault('printer', self.printer) | |
return Greeter(**kwargs) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment