2016-08-09 16 views
0

die folgende Klassenhierarchie gegeben:C++ Dependency Injection mit Injektions: "Entschlossenheit" Objekten eines Super-Typ

class AbstractPanel 
{ } 

class AbstractComponent : public AbstractPanel 
{ } 

class Component : public AbstractComponent 
{ } 

und die folgenden Hypodermischen DI Container:

Hypodermic::ContainerBuilder builder; 
builder.registerType<Component>(CREATE(new Component()))->as<Component>()->named<Component>("bkgrd_param_component"); 
(... and adding it to "di_container") 

Je nach Kontext, ein resolve() - Aufruf sieht wie folgt aus:

di_container->resolveNamed<AbstractComponent>("bkgrd_param_component") 

oder

di_container->resolveNamed<AbstractPanel>("bkgrd_param_component") 

Beide Aufrufe geben ein nullptr zurück, obwohl mein registriertes Objekt vom Typ "AbstractPanel" und "AbstractComponent" ist.

Wie muss ich das entwerfen? Ich kann die Klassenhierarchie nicht ändern, aber das Objekt abhängig von seinem Namen auflösen.

Hat jemand eine Idee?

Grüße, Vandahlen

Antwort

0

Obwohl Ihr Component ein AbstractComponent ist und ein AbstractPanel, Hypodermischen ist das nicht bewusst, das heißt, man muss sich davon erzählen.

container->resolveNamed<AbstractComponent>("bkgrd_param_component")

und

container->resolveNamed<AbstractPanel>("bkgrd_param_component")

wil:

ContainerBuilder builder; 

builder.registerType<Component>(CREATE(new Component())) 
     ->named<AbstractComponent>("bkgrd_param_component") 
     ->named<AbstractPanel>("bkgrd_param_component"); 

Auf diese Weise wird Component sowohl als AbstractComponent und AbstractPanel "bkgrd_param_component" und die Beschlüsse Sie gaben dem Namen bekannt l liefern zwei verschiedene Instanzen des Typs Component.

Es gibt eine neue nicht intrusive Version von Hypodermic, die Sie verwenden könnten. Der dsl ist ein bisschen eleganter:

ContainerBuilder builder; 

builder.registerType<Component>() 
     .named<AbstractComponent>("bkgrd_param_component") 
     .named<AbstractPanel>("bkgrd_param_component"); 

Werfen Sie einen Blick auf seine wiki.