Mein Code-Beispiel mit Ref/bind löst zyklische Abhängigkeiten auf. Automatische Konfiguration hatte ich bei uns für Java überhaupt nicht bewährt, weil man nichts mehr verstanden hat und daher finde ich das ist kein hilfreiches Feature.deamon hat geschrieben:Ein DI-Framework wie Spring nimmt einem die Auflösung der (auch zyklischen) Abhängigkeiten ab und kann teilweise automatisch Objekte konfigurieren.
Dafür bräuchtest du in Python irgendwelche Typannotationen. Könnte man machen, wäre aber eine freiwillge Angabe, z.B. so:
Code: Alles auswählen
class Foo:
__types__ = {'foo': Foo, 'bar': str, 'baz': [int]}
def bind(dct):
for o in dct.values():
if hasattr(o, '__types__'):
for n, t in o.__types__:
setattr(o, n, find(lambda o: isinstance(o, t), dct.values()))
...
def find(f, lst):
for o in lst:
if f(o): return o
Man braucht es nicht. Nichts ist aufwendig kompiliert und jede Datei lässt sich gleich einfach ändern. In Java wählt man den XML-Weg ja nur, weil der Java-Code eben nicht einfach anpassbar ist und nicht so ausdrucksstark ist, wie das XML-Fragment. Mit fehlender Eleganz hat das nichts zu tun, eher im Gegenteil.deamon hat geschrieben:Meine These ist, dass Abhängigkeiten eher in Kauf genommen werden, weil man ja (fast) immer den Quelltext vorliegen hat und dort bei Bedarf direkt ändern kann.
In Python könnte ich mir auch einfach dies ausdenken:
Code: Alles auswählen
beans = {}
def Bean(name, **kwargs):
if name in beans:
bean = beans[name]
else:
bean = beans[name] = locals()[name]()
bean.__bean = name
for k, v in kwargs.items():
setattr(bean, k, Ref(v.__bean) if hasattr(v, '__bean') else v)
Bean('MovieLister', finder=Bean('MovieFinder'))
Bean('MovieFinder', filename="movies.txt")
bind(beans)
Stefan[/code][/code]