Способы расширения скрывают зависимости?
Все,
Хотелось подумать об этом. В последнее время я все больше и больше становлюсь подписчикомпуристом» Принципы 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.Класс S (это может быть легко издеваться).
С моей точки зрения, первые два примера основаны на статических зависимостях (одна явная, другая скрытая), а вторая инвертирует зависимость и обеспечивает уменьшенную связь и лучшую тестируемость.
Так противоречит ли использование методов расширения принципам DI / IOC? Если ты'Вы являетесь подписчиком методологии МОК, избегаете ли вы использовать методы расширения?