IOC mag generell ein nettes Pattern sein, wenn ich hier aber herauslese, dass du Texturen per IOC bereitstellen willst, frage ich mich, ob das an dieser Stelle nicht totales Overengineering ist.
Texturen waren nur ein Beispiel, was mir sofort zu dem Thema in den Kopf gekommen ist. Laden werde ich sie später über den AssetManager, aber es wär schon praktisch, wenn ich den IOC Container einheitlich für die Instanziierung verwenden könnte.
Das verstehe ich nicht, kann der IOC-Container nicht gerade dieses Wissen (z.b. welche Render-API dahintersteckt) verwenden, um die passende Instanz bereitzustellen?
Ja und genau hier habe ich zur Zeit das gedankliche GAP. Ich greif noch mal die Texturen auf, um das Beispiel zu erläutern. Ich habe ein Interface ITexture und 2 konkrete Implementationen im Fall des OpenGL Renderers, GLTexture2D und GLTexture3D. Registrieren würde ich die wie folgt beim Hochfahren des Render Plug-Ins:
Code: Alles auswählen
container.bind<ITexture, GLTexture2D>();
container.bind<ITexture, GLTexture3D>();
Mal abgesehen davon, dass ich noch keine konkrete Idee habe wie ich die halte, evtl. als map<std::type_index, std::vector<std::type_index>> (es soll in jedem Fall für ein Interface oder eine konkrete Klasse nur einmal die Registrierung möglich sein). In diesem Fall habe ein Interface und 2 konkrete Implementationen. Abfragen würde man sie normalerweise über das Interface, da der Aufrufer ja nicht die konkrete Renderimplementation kennen muss:
Woher soll der Container wissen, was er erzeugen soll, wenn ich hier den Resolve-Aufruf nicht parametrisiere. Eine Idee wäre eine namens ID, was aber voraussetzt dass jeder Aufrufer die ID kennt. Denke diesen Ansatz muss ich so oder so umsetzen, ist aber für eine Typen abhängige Erzeugung meiner Meinung nach ungeeignet und eher für Instanzen verwendet, die als Singleton gehalten werden. Alternativ wären Parameter die man hier mitgeben kann, ich meine aber mehrfach gelesen zu haben, dass dies eigentlich das IOC Prizip durchbricht und man den Container zum Service-Pattern umfunktioniert. Ein weiterer Ansatz wäre es die Factory zu registrieren und über sie die Texturen zu erzeugen.
Alle Ansätze haben irgendwie Ihre Pros und Contras. Bin mir absolut unschlüssig was ideal wär. Daher die Frage, wie Ihr das umsetzen würdet, bzw. habt, wenn Ihr das IOC-Pattern nutzt ...