Czy metody rozszerzenia ukrywają zależności?

Wszystko,

Chciałem się nad tym zastanowić. Ostatnio coraz częściej staję się subskrybentem „purystycznych” zasad DI / IOC przy projektowaniu / rozwijaniu. Część tego (duża część) polega na upewnieniu się, że między moimi klasami jest niewiele sprzężeń i że ich zależności są rozwiązywane za pośrednictwem konstruktora (z pewnością istnieją inne sposoby zarządzania tym, ale masz pomysł).

Moim podstawowym założeniem jest to, że metody rozszerzenia naruszają zasady DI / IOC.

Stworzyłem następującą metodę rozszerzenia, której używam, aby zapewnić, że ciągi wstawione do tabel bazy danych zostaną obcięte do odpowiedniego rozmiaru:

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);
    }
}

Mogę wtedy wywołać mój ciąg z innej klasy, takiej jak ta:

string myString = "myValue.TruncateThisPartPlease.";
myString.TruncateToSize(8);

Sprawiedliwym tłumaczeniem tego bez użycia metody rozszerzenia byłoby:

string myString = "myValue.TruncateThisPartPlease.";
StaticStringUtil.TruncateToSize(myString, 8);

Nie można przetestować żadnej klasy, która używa któregokolwiek z powyższych przykładów, niezależnie od klasy zawierającej metodę TruncateToSize (na bok TypeMock). Gdybym nie korzystał z metody rozszerzenia i nie chciałem tworzyć zależności statycznej, wyglądałoby to bardziej jak:

string myString = "myValue.TruncateThisPartPlease.";
_stringUtil.TruncateToSize(myString, 8);

W ostatnim przykładzie zależność _stringUtil zostanie rozwiązana za pomocą konstruktora, a klasa może zostać przetestowana bez zależności od rzeczywistej klasy metody TruncateToSize (można ją łatwo wyszydzić).

Z mojego punktu widzenia pierwsze dwa przykłady opierają się na zależnościach statycznych (jeden wyraźny, drugi ukryty), podczas gdy drugi odwraca zależność i zapewnia mniejsze sprzężenie i lepszą testowalność.

Czy użycie metod rozszerzeń jest sprzeczne z zasadami DI / IOC? Jeśli jesteś subskrybentem metodologii IOC, czy unikasz stosowania metod rozszerzenia?

questionAnswers(4)

yourAnswerToTheQuestion