Инъекция C ++ зависимостей с подкожным введением: & quot; разрешить & quot; Объекты супертипа

учитывая следующую иерархию классов:

class AbstractPanel
{ }

class AbstractComponent : public AbstractPanel
{ }

class Component : public AbstractComponent
{ }

и следующий контейнер для подкожных инъекций:

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

В зависимости от контекста resolv () — Call выглядит так:

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

или же

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

Оба вызова возвращают nullptr, хотя мой зарегистрированный объект имеет тип «AbstractPanel» и «AbstractComponent».

Как мне это спроектировать?
Я не могу изменить иерархию классов, но хочу разрешить объект, в зависимости от его имени.

У кого-нибудь есть идея?

С уважением, Вандален

0

Решение

Хотя твой Component является AbstractComponent и AbstractPanel, подкожный не знает об этом, то есть вы должны сказать это сами.

ContainerBuilder builder;

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

Сюда, Component известен как оба AbstractComponent а также AbstractPanel названный «bkgrd_param_component» и резолюции, которые вы дали:

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

а также

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

будет предоставлять два разных экземпляры типа Component,

Существует новая ненавязчивая версия подкожный Вы могли бы использовать. Dsl немного элегантнее:

ContainerBuilder builder;

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

Посмотрите на его вики.

0

Другие решения

Других решений пока нет …