Я предпочитаю последний подход. Это позволяет нам лучше изолировать наши компоненты. Если ваша ViewModel принимает ICarService, вы можете легко смоделировать это, и любые зависимости, которые есть у вашей реализации ICarService, могут быть проверены при тестировании , что .
Это легко понять, и это хорошее место, чтобы поместить больше логики, чем обычная фабрика. Например, мы поместили бы методы, которые вы обычно помещаете в репозиторий. (Сохранить, получить и т. Д.).