2011-06-24 4 views
5

Considérons un module, par ex. some_module, que divers modules utilisent dans le même processus d'interprétation. Ce module aurait un seul contexte. Pour que les méthodes some_module fonctionnent, il doit recevoir une injection de dépendance d'une instance de classe.Injection de dépendances aux modules

Quelle serait une façon pythonique et élégante d'injecter la dépendance au module?

Répondre

1

opinion IMHO complète à part Dependency Injection avec tout le jargon est mieux adapté aux langues statiquement typé comme Java, en python, vous pouvez accomplir très facilement par exemple ici est un os à nu injection

class DefaultLogger(object): 
    def log(self, line): 
     print line 

_features = { 
    'logger': DefaultLogger 
    } 

def set_feature(name, feature): 
    _features[name] = feature 

def get_feature(name): 
    return _features[name]() 

class Whatever(object): 

    def dosomething(self): 
     feature = get_feature('logger') 

     for i in range(5): 
     feature.log("task %s"%i) 

if __name__ == "__main__": 
    class MyLogger(object): 
     def log(sef, line): 
     print "Cool",line 

    set_feature('logger', MyLogger) 

    Whatever().dosomething() 

sortie:

Cool task 0 
Cool task 1 
Cool task 2 
Cool task 3 
Cool task 4 

Si vous pensez que quelque chose manque, nous pouvons facilement l'ajouter, son python.

+1

Il ne s'agit pas d'une injection de dépendance mais d'un localisateur de service. – deamon

+0

@deamon Peut-être que ce n'est aucun, peut-être c'est à la fois 'get_feature ('logger')' est localisateur de service mais set_feature injecte MyLogger au début de l'application, c'est un bon lien entre les différences http://martinfowler.com/ articles/injection.html # ServiceLocatorVsDependencyInjection –

+0

Malheureusement, il s'agit d'un localisateur de service. Et [Service Locator est un anti-modèle] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern) –

2

Utilisez un module global.

import some_module 
some_module.classinstance = MyClass() 

some_module peut avoir le code pour mettre en place une instance par défaut si l'on est pas reçu, ou tout simplement mettre classinstance-None et assurez-vous qu'il est défini lorsque les méthodes sont invoquées.