Func<IQueryService>
- в этом случае действительно замаскированная абстрактная фабрика.Таким образом, вопрос на самом деле таков: «почему вы хотите использовать фабрику вместо инъекции самого объекта?»
Вы используете фабрику, когда время жизни такого экземпляра имеет значение для потребителя, вам нужно контролировать время жизниэтого экземпляра, или экземпляр дорогой для создания.Хороший пример этого - когда объекты реализуют IDisposable
.За одноразовыми объектами часто требуется явное управление.
Лично мне не нравится использовать Func<T>
делегаты в качестве фабрик, потому что это делает ваш код менее явным.Вместо того, чтобы зависеть от Func<IQueryService>
, пусть класс зависит от IQueryServiceFactory
.Это делает ваш код намного более явным.Недостатком этого подхода, конечно, является то, что вам придется писать больше кода (не много, но все же).
Второй конструктор использует шаблон внедрения зависимостей.Первый конструктор, однако, является примером DI для бедняков.Это способ внедрения зависимостей для модульного тестирования, но избавляет вас от необходимости использовать инфраструктуру внедрения зависимостей для вашего производственного кода.Недостатком этого подхода является необходимость зависимости от контейнера (класс Factory
в вашем случае), который называется Service Locator .Другим недостатком является то, что он делает необходимые зависимости класса менее очевидными.