Minimal IoC container for DI