Учитывая приведенный вами пример, вы почти на месте.Вы уже используете фабрику для создания экземпляра вашего контроллера страниц, но ваш контроллер страниц создает экземпляры пользователей напрямую, и так как ваш пользователь должен знать базу данных.
То, что вы хотите сделать, это использовать фабрику для создания экземпляров ваших пользовательских объектов.Таким образом, фабрика может знать о базе данных и может создавать пользовательские экземпляры, которые тоже об этом знают.Вам, вероятно, будет лучше создавать интерфейсы для всех зависимостей, что поможет в тестировании и будет означать, что ваш код хорошо отделен.
Создайте IUserFactory, который создает реализации IUser, и передайте это в свой PageControllerFactory, тогда вашему ApplicationController нужно знать только о PageControllerFactory, ему не нужно ничего знать о IUserFactory или базе данных.
Затем при запуске приложения вы можете создать все свои зависимости и внедрить их друг в друга через конструкторы.