使用依赖注入时,我的接口和具体类之间存在一对一的关系,我对此感到内疚。当我需要向接口添加方法时,我最终会破坏所有实现该接口的类。
这是一个简单的例子,但是让我们假设我需要将一个注入ILogger
到我的一个类中。
public interface ILogger
{
void Info(string message);
}
public class Logger : ILogger
{
public void Info(string message) { }
}
像这样的一对一关系感觉就像是代码味道。由于我只有一个实现,如果我创建一个类并将该Info
方法标记为虚拟以在我的测试中覆盖而不是只为单个类创建接口,是否存在任何潜在问题?
public class Logger
{
public virtual void Info(string message)
{
// Log to file
}
}
如果我需要另一个实现,我可以覆盖该Info
方法:
public class SqlLogger : Logger
{
public override void Info(string message)
{
// Log to SQL
}
}
如果这些类中的每一个都有会创建泄漏抽象的特定属性或方法,我可以提取一个基类:
public class Logger
{
public virtual void Info(string message)
{
throw new NotImplementedException();
}
}
public class SqlLogger : Logger
{
public override void Info(string message) { }
}
public class FileLogger : Logger
{
public override void Info(string message) { }
}
我没有将基类标记为抽象的原因是因为如果我想添加另一个方法,我不会破坏现有的实现。例如,如果我FileLogger
需要一个Debug
方法,我可以更新基类Logger
而不破坏现有的SqlLogger
.
public class Logger
{
public virtual void Info(string message)
{
throw new NotImplementedException();
}
public virtual void Debug(string message)
{
throw new NotImplementedException();
}
}
public class SqlLogger : Logger
{
public override void Info(string message) { }
}
public class FileLogger : Logger
{
public override void Info(string message) { }
public override void Debug(string message) { }
}
同样,这是一个简单的例子,但我什么时候应该更喜欢界面?