所有,扩展方法隐藏相关性吗?
想获得这样的一些想法。最近,我在设计/开发时越来越多地成为“纯粹”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方法论的订户,您是否避免使用扩展方法?
您的扩展方法不检查空输入! – canon 2011-08-04 02:39:04
@antisanity:AFAIK对于扩展方法的实例参数(在本例中为* input *)为空,在逻辑上是不可能的。 – 2011-08-04 03:24:23
是的,菲尔......它可以是空的。 – canon 2011-08-22 14:10:33