При использовании внедрения зависимостей, какие зависимости вы вводите?
Я ранее вводил все зависимости, но обнаружил, что при выполнении TDD обычно есть два типа зависимостей:
- Те, которыеподлинные внешние зависимости, которые могут изменяться, например ProductRepository
- Те, которые существуют исключительно для тестируемости, например, часть поведения класса, который был извлечен и введен только для тестируемости
Один из подходовчтобы внедрить ВСЕ зависимости как это
public ClassWithExternalDependency(IExternalDependency external,
IExtractedForTestabilityDependency internal)
{
// assign dependencies ...
}
, но я обнаружил, что это может вызвать раздувание зависимостей в реестре DI.
Другой подход состоит в том, чтобы скрыть «зависимость тестируемости» как это
public ClassWithExternalDependency(IExternalDependency external)
: this (external, new ConcreteClassOfInternalDependency())
{}
internal ClassWithExternalDependency(IExternalDependency external,
IExtractedForTestabilityDependency internal)
{
// assign dependencies ...
}
Это больше усилий, но, похоже, гораздо больше смысла.Недостатком является то, что не все объекты сконфигурированы в структуре DI, тем самым нарушая «лучшую практику», которую я слышал.
Какой подход вы бы поддержали и почему?