如何在SimpleInjector容器中注册Rectangle
接口,同时将ILogger
注入其基类Shape
?
这样做的目的是使派生类不关心ILogger
。 ILogger
是一种基础结构服务,用于将某些值记录到文件中以进行调试。
public class Shape : IShape
{
public void Shape(ILogger logger){}
public virtual void Draw(){}
}
public class Rectanble : Shape
{
public void Reactangular();
public override void Draw(){}
}
答案 0 :(得分:2)
要实现这一点,您必须通过派生类的构造函数公开logger:
public class Rectangle : Shape
{
public Rectangle(ILogger logger) : base(logger) { }
public override void Draw(){}
}
请注意,处理交叉问题(如日志记录)的基类是违反单一责任原则的强烈指示。这些基类很容易变成包含大量依赖关系的不断变化的类,使派生类更难以测试和维护。
使用装饰器实现横切关注点通常要好得多,而不是让基类具有依赖关系。这使基类保持干净,甚至通常允许完全删除基类(或者使其纯粹抽象,或者用接口替换它)。