Способы расширения скрывают зависимости?

Все,

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

Ответы на вопрос(4)

Ваш ответ на вопрос