Все,
Хотел высказать несколько мыслей по этому поводу. В последнее время я становлюсь все более и более приверженцем "пуристских" принципов 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, избегаете ли вы использования методов расширения?