fix autowiring in base classes

This commit is contained in:
Stephan Dilly 2016-02-09 22:21:36 +01:00
parent a8f455893a
commit f84b025110
2 changed files with 22 additions and 0 deletions

View file

@ -101,6 +101,12 @@ public void autowire(Type)(shared(DependencyContainer) container, Type instance)
printDebugAutowiredInstance(typeid(Type), &instance); printDebugAutowiredInstance(typeid(Type), &instance);
} }
// note: recurse into base class if there are more between Type and Object in the hirarchy
static if(BaseClassesTuple!Type.length > 1)
{
autowire!(BaseClassesTuple!Type[0])(container, instance);
}
foreach(idx, name; FieldNameTuple!Type) { foreach(idx, name; FieldNameTuple!Type) {
autowireMember!(name, idx, Type)(container, instance); autowireMember!(name, idx, Type)(container, instance);
} }

View file

@ -47,6 +47,9 @@ version(unittest) {
class ComponentX : InterfaceA {} class ComponentX : InterfaceA {}
class ComponentZ : ComponentB {
}
class MonkeyShine { class MonkeyShine {
@Autowire!ComponentX @Autowire!ComponentX
public InterfaceA component; public InterfaceA component;
@ -198,4 +201,17 @@ version(unittest) {
assert(charlie.componentA !is regularComponentA, "Autowiring class with AssignNewInstance did not yield a different instance"); assert(charlie.componentA !is regularComponentA, "Autowiring class with AssignNewInstance did not yield a different instance");
} }
// Test autowiring members from base class
unittest {
shared(DependencyContainer) container = new DependencyContainer();
container.register!ComponentA;
container.register!ComponentB;
container.register!ComponentZ;
auto instance = new ComponentZ();
container.autowire(instance);
assert(instance.componentA !is null);
}
} }