[feature] add factory
[feature] simplify di container