Контейнер внедрения зависимости может обрабатывать создание всех объектов. Это включает ваш DIC, использующий фабрики для создания определенных объектов, которые используют фабричный образец.
Мне нравится загружать мой DIC замыканиями, которые создают объекты. Таким образом, все объекты загружаются лениво только по запросу, но я все еще могу иметь большую гибкость, когда дело доходит до создания объекта.
Вы могли бы написать таким образом, что ваш datamapper получает пустой объект пользовательского значения, а затем инициализирует данные объекта на основе данных БД. Альтернативой является создание тесной связи между вашими datamapper и классами пользовательских значений, когда один создает другой самостоятельно.
Попытка отделить ваш фреймворк от вашей бизнес-логики не должна означать недопущение соприкосновения этих двух компонентов, просто то, что код бизнес-логики не входит в код вашего фреймворка использование DIC для создания объектов, используемых для бизнес-логики, не означает, что в вашем DIC есть бизнес-логика.