全部,
想对此有一些想法。最近,在设计/开发时,我越来越成为“纯粹” DI/IOC 原则的订户。其中一部分(很大一部分)涉及确保我的类之间几乎没有耦合,并且它们的依赖关系通过构造函数解决(当然还有其他管理方法,但你明白了)。
我的基本前提是扩展方法违反了 DI/IOC 的原则。
我创建了以下扩展方法,用于确保插入到数据库表中的字符串被截断为正确的大小:
public static class StringExtensions
{
public static string TruncateToSize(this string input, int maxLength)
{
int lengthToUse = maxLength;
if (input.Length < maxLength)
{
lengthToUse = input.Length;
}
return input.Substring(0, lengthToUse);
}
}
然后我可以从另一个类中调用我的字符串,如下所示:
string myString = "myValue.TruncateThisPartPlease.";
myString.TruncateToSize(8);
不使用扩展方法的公平翻译是:
string myString = "myValue.TruncateThisPartPlease.";
StaticStringUtil.TruncateToSize(myString, 8);
使用上述任一示例的任何类都不能独立于包含 TruncateToSize 方法(除了 TypeMock)的类进行测试。如果我没有使用扩展方法,并且我不想创建静态依赖项,它看起来更像:
string myString = "myValue.TruncateThisPartPlease.";
_stringUtil.TruncateToSize(myString, 8);
在最后一个示例中,_stringUtil 依赖项将通过构造函数解析,并且可以在不依赖实际 TruncateToSize 方法的类的情况下测试该类(它可以很容易地模拟)。
从我的角度来看,前两个示例依赖于静态依赖(一个显式,一个隐藏),而第二个示例反转依赖并提供减少的耦合和更好的可测试性。
那么扩展方法的使用与DI/IOC原则有冲突吗?如果您是 IOC 方法的订阅者,您会避免使用扩展方法吗?