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?