Все,
Хотелось бы высказать несколько соображений по этому поводу. В последнее время я становлюсь все более и более подписчиком "пуристских" принципов ДИ/МОК при проектировании/разработке. Часть этого (большая часть) связана с тем, что между моими классами существует небольшая связь и что их зависимости разрешаются с помощью конструктора (есть, конечно, другие способы управления этим, но вы получаете идею).
Моя основная предпосылка заключается в том, что методы расширения нарушают принципы 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, избегайте использования методов расширения?