皮下注射的C ++依赖注入:“解析”超类型的对象

时间:2016-08-09 14:11:24

标签: c++ dependency-injection hypodermic

给出以下类层次结构:

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,尽管我的注册Object都是“AbstractPanel”和“AbstractComponent”类型。

我该如何设计呢? 我无法更改类层次结构,但希望根据其名称解析Object。

有人有想法吗?

问候,Vandahlen

1 个答案:

答案 0 :(得分:0)

虽然您的AbstractComponentAbstractPanelContainerBuilder builder; builder.registerType< Component >(CREATE(new Component())) ->named< AbstractComponent >("bkgrd_param_component") ->named< AbstractPanel >("bkgrd_param_component"); 皮下注射并不知道,也就是说,您必须告诉它自己。

Component

这样,AbstractComponent被称为AbstractPanelcontainer->resolveNamed< AbstractComponent >("bkgrd_param_component") ,名为&#34; bkgrd_param_component&#34;以及你给出的决议:

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

Component

将提供类型ContainerBuilder builder; builder.registerType< Component >() .named< AbstractComponent >("bkgrd_param_component") .named< AbstractPanel >("bkgrd_param_component"); 的两个不同实例。

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

protected void onStop() {

    super.onStop();

    try {
        // Do we need to unbind????
        iBeaconManager.unbind(this);

        beaconBkgService.startScanning();

      } catch (Exception e) {
        e.printStackTrace();
      }

}

查看其wiki

相关问题