Os métodos de extensão ocultam dependências?

Todos,

Queria ter alguns pensamentos sobre isso. Ultimamente, estou me tornando cada vez mais um assinante de princípios "puristas" de DI / COI ao projetar / desenvolver. Parte disso (uma grande parte) envolve garantir que haja pouco acoplamento entre minhas classes e que suas dependências sejam resolvidas por meio do construtor (há certamente outras maneiras de gerenciar isso, mas você entende a ideia).

Minha premissa básica é que os métodos de extensão violam os princípios do DI / IOC.

Eu criei o seguinte método de extensão que eu uso para garantir que as seqüências de caracteres inseridas em tabelas de banco de dados são truncadas para o tamanho certo:

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

Eu posso chamar minha string de outra classe da seguinte forma:

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

Uma tradução justa disso sem usar um método de extensão seria:

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

Qualquer classe que usa um dos exemplos acima não pôde ser testada independentemente da classe que contém o método TruncateToSize (TypeMock aparte). Se eu não estivesse usando um método de extensão e não quisesse criar uma dependência estática, seria mais parecido com:

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

No último exemplo, a dependência de _stringUtil seria resolvida por meio do construtor e a classe poderia ser testada sem dependência da classe do método TruncateToSize real (ela poderia ser facilmente ridicularizada).

Do meu ponto de vista, os dois primeiros exemplos dependem de dependências estáticas (uma explícita, outra oculta), enquanto a segunda inverte a dependência e fornece acoplamento reduzido e melhor testabilidade.

Então, o uso de métodos de extensão entra em conflito com os princípios de DI / COI? Se você é um assinante da metodologia IOC, você evita usar métodos de extensão?

questionAnswers(4)

yourAnswerToTheQuestion