Внедрение в конструктор (первый подход) лучше шаблона поиска сервисов (второй подход) по нескольким причинам.
Во-первых, локатор служб скрывает зависимости. Во втором примере, если рассматривать только открытый интерфейс, невозможно узнать, что ProductControllers
нужны репозитории.
Более того, я должен повторить OdeToCode . Я думаю
IProductRepository repository = Mockery.NewMock<IProductRepository>();
IProductController controller = new ProductController(repository);
яснее, чем
ObjectFactory.SetFactory(IProductRepository, new MockRepositoryFactory())
IProductController controller = new ProductController();
Особенно, если ObjectFactory настроен в методе SetUp
тестового устройства.
Наконец, шаблон локатора сервиса явно неоптимален, по крайней мере, в одном конкретном случае: когда вы пишете код, который будет использоваться людьми, пишущими приложения вне вашего контроля. Я держу пари, что люди обычно предпочитают инъекцию конструктора (или один из других методов DI), потому что это применимо для каждого сценария. Почему бы не использовать метод, который охватывает все случаи?
(Мартин Фаулер предлагает гораздо более тщательный анализ в "Инверсия контейнеров управления и шаблон внедрения зависимостей" , особенно в разделе "Локатор служб и внедрение зависимостей").