Tutti,I metodi di estensione nascondono le dipendenze?
Volevo fare qualche riflessione su questo. Ultimamente sto diventando sempre più un sottoscrittore di principi DI/IOC "puristi" durante la progettazione/sviluppo. Parte di questo (una parte importante) consiste nell'assicurarsi che ci sia un piccolo accoppiamento tra le mie classi e che le loro dipendenze siano risolte tramite il costruttore (ci sono sicuramente altri modi per gestirlo, ma si ottiene l'idea).
La mia premessa di base è che i metodi di estensione violano i principi di DI/IOC.
ho creato il seguente metodo di estensione che uso per garantire che le stringhe inserite in tabelle di database vengono troncati alla giusta dimensione:
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);
}
}
posso quindi chiamare la mia stringa all'interno di un'altra classe in questo modo:
string myString = "myValue.TruncateThisPartPlease.";
myString.TruncateToSize(8);
una fiera traduzione di questo senza usare un metodo di estensione sarebbe:
string myString = "myValue.TruncateThisPartPlease.";
StaticStringUtil.TruncateToSize(myString, 8);
Qualsiasi classe che utilizza uno degli esempi precedenti non può essere testata indipendentemente dalla classe che contiene il metodo TruncateToSize (TypeMock a parte). Se non fossi utilizzando un metodo di estensione, e non volevo creare una dipendenza statica, sarebbe più simile:
string myString = "myValue.TruncateThisPartPlease.";
_stringUtil.TruncateToSize(myString, 8);
Nell'ultimo esempio, la dipendenza _stringUtil sarebbero risolti tramite il costruttore e la classe potrebbe essere testato senza alcuna dipendenza dalla classe del metodo TruncateToSize effettivo (potrebbe essere facilmente deriso).
Dal mio punto di vista, i primi due esempi si basano su dipendenze statiche (una esplicita, una nascosta), mentre la seconda inverte la dipendenza e fornisce un accoppiamento ridotto e una migliore testabilità.
Così l'uso dei metodi di estensione è in conflitto con i principi DI/IOC? Se sei un abbonato alla metodologia IOC, eviti di usare i metodi di estensione?
Il metodo di estensione non controlla l'input nullo! – canon
@antisanity: AFAIK è logicamente impossibile che il parametro di istanza di un metodo di estensione (* input * in questo caso) sia nullo. –
Sì, Phil ... può essere nullo. – canon