给出以下类层次结构:
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
答案 0 :(得分:0)
虽然您的AbstractComponent
是AbstractPanel
和ContainerBuilder builder;
builder.registerType< Component >(CREATE(new Component()))
->named< AbstractComponent >("bkgrd_param_component")
->named< AbstractPanel >("bkgrd_param_component");
,皮下注射并不知道,也就是说,您必须告诉它自己。
Component
这样,AbstractComponent
被称为AbstractPanel
和container->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。