add factory and DI