1

Мне было интересно, существует ли какая-либо передовая практика для предоставления зависимостей абстрактным компонентам.Предоставление зависимостей от абстрактных классов

Допустим, у меня есть метод шаблона алгоритм, как это:

public abstract class TemplateMethod 
{    
    protected abstract void StepA(); 
    protected abstract void StepB(); 
    protected abstract void StepC(); 

    public void Go() 
    {    
     StepA();  
     StepB();  

     CommonLogic(); 

     StepC(); 
    } 

    private CommonLogic() 
    { 
     myDependency.DoSomething(); 
    }  
} 

мне не удалось внедрить myDependecy к классу, так как абстрактные TemplateMethod, конечно, никогда не инстанцирован. Мне удалось предоставить это сервисное местоположение, но я уверен, что есть лучший способ сделать это.

Любые идеи?

PS Использование Замок Виндзор как контейнер IoC.

ответ

3

Просто потому, что абстрактный класс не может быть непосредственно создан, не означает, что он не может иметь конструктор. Вы можете использовать обычную инъекцию конструктора с абстрактным классом (пожалуйста, протестируйте). Если вы не можете, вы можете передать зависимость от базового класса, как это:

public class ChildClass: TemplateMethod 
{ 
    public ChildClass(IMyDependencyType myDependency) : base(myDependency) {} 
} 

public abstract class TemplateMethod 
{ 
    protected IMyDependencyType myDependency; 

    protected TemplateMethod(IMyDependencyType myDependency) 
    { 
     this.myDependency = myDependency; 
    } 
} 
+0

Спасибо! Отличный ответ. –

+1

Конструктор должен быть защищен. –

1

Ваша конкретная реализация может объявить обязательную зависимость через свой конструктор, который в свою очередь будет передан в базовый конструктор, как im1dermike показал ,

В качестве альтернативы, если это необязательная зависимость, вы можете объявить свойство в базовом классе, и Windsor будет заполняться, если это возможно.

+0

+1 Спасибо за ваш вклад Фил! –

Смежные вопросы