为抽象类提供依赖关系

时间:2014-02-14 16:14:13

标签: asp.net-mvc design-patterns inversion-of-control castle-windsor template-method-pattern

我想知道是否有一些最佳实践来为Abstract组件提供依赖项。

假设我有这样的模板方法算法:

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使用 Castle Windsor 作为IoC容器。

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

你的具体实现可以通过它的构造函数声明一个强制依赖,而构造函数又会像im1dermike所示那样传递给基础构造函数。

或者,如果它是一个可选的依赖项,你可以在基类上声明属性,如果可以的话,Windsor将填充。