diff --git a/source/poodinis/autowire.d b/source/poodinis/autowire.d index 8d73861..0eb3647 100644 --- a/source/poodinis/autowire.d +++ b/source/poodinis/autowire.d @@ -101,6 +101,12 @@ public void autowire(Type)(shared(DependencyContainer) container, 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) { autowireMember!(name, idx, Type)(container, instance); } diff --git a/test/poodinis/autowiretest.d b/test/poodinis/autowiretest.d index e3ae57b..1c0d0fa 100644 --- a/test/poodinis/autowiretest.d +++ b/test/poodinis/autowiretest.d @@ -47,6 +47,9 @@ version(unittest) { class ComponentX : InterfaceA {} + class ComponentZ : ComponentB { + } + class MonkeyShine { @Autowire!ComponentX public InterfaceA component; @@ -198,4 +201,17 @@ version(unittest) { 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); + } }