2011-06-24 17 views
5

Considere un módulo, p. some_module, que varios módulos usan en el mismo proceso de intérprete. Este módulo tendría un contexto único. Para que los métodos some_module funcionen, debe recibir una inyección de dependencia de una instancia de clase.Dependencia Inyección a los módulos

¿Cuál sería una forma pitón y elegante de inyectar la dependencia al módulo?

Respuesta

1

opinión en mi humilde opinión pleno derecho Dependency Injection con toda la jerga se adapta mejor al tipo estático lenguajes como Java, en Python que se puede lograr muy fácilmente por ejemplo, aquí hay un hueso desnudo 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() 

de salida:

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

Si cree que falta algo, podemos agregarlo fácilmente, su pitón.

+1

Esto no es una inyección de dependencia sino un localizador de servicios. – deamon

+0

@deamon Puede ser que no sea ninguno, puede ser ambos 'get_feature ('logger')' es el localizador de servicios pero set_feature inyecta MyLogger al inicio de la aplicación, este es un buen enlace entre las diferencias http://martinfowler.com/ articles/injection.html # ServiceLocatorVsDependencyInjection –

+0

Desafortunadamente este es un localizador de servicio. Y [Service Locator es un antipatrón] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern) –

2

Utilice un módulo global.

import some_module 
some_module.classinstance = MyClass() 

some_module puede tener código para configurar una instancia predeterminada si no se recibe, o simplemente establecer classinstance a None y comprobar para asegurarse de que está establecido cuando se invocan los métodos.

Cuestiones relacionadas