0

给定以下类层次结构:

class AbstractPanel
{ }

class AbstractComponent : public AbstractPanel
{ }

class Component : public AbstractComponent
{ }

和以下皮下 DI 容器:

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

根据上下文,resolve()-Call 看起来像这样:

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

或者

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

两个调用都返回一个 nullptr,尽管我注册的对象的类型都是“AbstractPanel”和“AbstractComponent”。

我该如何设计这个?我无法更改类层次结构,但想要解析对象,具体取决于它的名称。

有人有想法吗?

问候, 万达伦

4

1 回答 1

0

虽然你Component是一个AbstractComponent和一个AbstractPanel,但Hypodermic并没有意识到这一点,也就是说,你必须自己告诉它。

ContainerBuilder builder;

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

这样,Component被称为两者AbstractComponentAbstractPanel 命名为“bkgrd_param_component”和您给出的分辨率:

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

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

将提供两个不同的 type 实例Component

您可以使用新的非侵入式Hypodermic版本。Dsl 更优雅一点:

ContainerBuilder builder;

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

看看它的维基

于 2017-07-14T12:12:05.197 回答