учитывая следующую иерархию классов:
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».
Как мне это спроектировать?
Я не могу изменить иерархию классов, но хочу разрешить объект, в зависимости от его имени.
У кого-нибудь есть идея?
С уважением, Вандален
Хотя твой 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");
Посмотрите на его вики.
Других решений пока нет …