2011-06-24 36 views
5

Rozważ moduł, np. some_module, że różne moduły używają w tym samym procesie tłumacza. Ten moduł miałby jeden kontekst. Aby metody some_module mogły działać, musi on otrzymać wtrysk zależności instancji klasy.Wstrzykiwanie zależności od modułów

Jaki byłby python i elegancki sposób wstrzyknięcia zależności do modułu?

Odpowiedz

1

IMHO opinia pełnoprawnym Dependency Injection ze wszystkimi żargonie jest lepiej dostosowany do statycznie wpisywanych języków takich jak Java, Python można to osiągnąć bardzo łatwo np Oto goły w kości 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() 

wyjściowa:

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

Jeśli uważasz, że czegoś brakuje, możemy to łatwo dodać, to jest pyton.

+1

To nie jest zastrzyk zależności, ale lokalizator usług. – deamon

+0

@deamon Może być to brak, może to być zarówno 'get_feature ('logger')' to service locator ale set_feature wstrzykuje MyLogger na początku aplikacji, jest to dobre połączenie między różnicami http://martinfowler.com/ articles/injection.html # ServiceLocatorVsDependencyInjection –

+0

Niestety jest to lokalizator usług. I [Lokalizator Usług jest antyplemionem] (http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern) –

2

Użyj modułu globalnego.

import some_module 
some_module.classinstance = MyClass() 

some_module może mieć kod do utworzenia instancji domyślnej, jeśli nie zostanie odebrany, lub po prostu ustawić classinstance do None i sprawdzić, czy jest on ustawiony, gdy metody są wywoływane.

Powiązane problemy