В обоих приведенных примерах используется анти-паттерн Control Freak , как описано в Внедрение зависимостей, Принципы, практика, паттерны второго издания .
Происходит анти-паттерн Control Freak :
каждый раз, когда вы зависите от изменчивой зависимости в любом месте, кроме корня композиции . Это нарушение принципа обращения зависимостей
В первом примере, хотя MyClass
использует абстракцию IDependency
, она перетаскивает ссылку на конкретный компонент ConcreteDependency
, в результате чего два класса тесно связаны .
Такая же тесная связь происходит во втором примере, и это фактически тот же самый анти-паттерн. Кроме того, во втором примере даже используется метод Initialize
для применения зависимости к уже созданному экземпляру MyClassBase
. Это вызывает Temporal Coupling , который сам по себе пахнет кодом.
Правильное решение предотвращает сильную связь и временную связь, что означает, что вы используете Конструктор Injection и определяете только один конструктор :
public MyClass
{
private IDependency dependency;
public MyClass(IDependency dependency)
{
if (dependency == null) throw new ArgumentNullException("dependency");
this.dependency = dependency;
}
}