Rolf B: Nachtrag: Decorator

Beitrag lesen

Hallo MB,

verstehst Du nicht? Dein ServiceContainer passt für mich auf das Fabrik-Pattern. Eine Fabrik liefert auf Abfrage bestimmte Objekte.

Dass deine ServiceClass auch Methoden hat, die an Methoden der Services delegieren, hat Du vorher nicht geschrieben. Das würde ich aber auch nicht machen. Dann ist sie kein Service-Container mehr, sondern nutzt wiederum Services für eigene Arbeit. Und dann ziehst Du die Services wieder in einen eigenen Container hinaus? Das wäre nun over-engineering in höchstem Maß.

Ich habe dich so verstanden, dass ServiceClass nur eine Aufgabe hat: Instanzen von bestimmten Services bereitzustellen. Das ist eine Servicefabrik. Du hast ein paar spezielle Implementierungsdetails:

  • die Fabrik erzeugt bei ihrer Eröffnung alle Services auf einmal und stellt bei jeder Anfrage nach dem Service Foo das gleiche FooService-Objekt bereit. Man kann das als Caching der Services betrachten.
  • die Anfrage erfolgt nicht über einen getFooService-Methodenaufruf, sondern mittels Zugriff auf ein Property. Der Anwender greift direkt in den Cache.
  • die Singletons werden nicht von den Serviceklassen gebildet und gehalten, sondern von der Servicefabrik. Es sind aber trotzdem welche (es sei denn, du hast mehrere ServiceClass-Instanzen und die tragen ihre eigenen Service-Instanzen mit sich)

Es wäre klarer, wenn die ServiceClass die Services über Methoden bereitstellte. Das würde den Cache der Service-Instanzen gegen unbefugte Veränderung schützen. Und es ermöglicht eine lacy - hihi - lazy creation der Services. Bei Services, die sich ggf. nicht als Einzelexemplar eignen, weil sie einen veränderlichen Zustand haben, kannst Du dann fallweise auf das Cachen verzichten. Sowas muss der Nutzer des Services gar nicht wissen.

Wenn Du im Programmablauf Arbeit aus deiner Klassenhierarchie hinaus delegieren willst, erzeuge Worker-Services (die kann wiederum die Servicefabrik bei Bedarf liefern und aus den den erforderlichen Dienst-Services komponieren). Einen Worker für die Aufgabe XY kann eine Klasse dann bei der Servicefabrik einkaufen und ihn mit den benötigten Daten laufen lassen. Sowas bringt Entkoppelung, Wiederverwendbarkeit und Unittestbarkeit, kostet aber natürlich etwas Laufzeit.

Rolf

--
sumpsi - posui - clusi