Todo,¿Los métodos de extensión ocultan las dependencias?
Quería obtener algunas ideas al respecto. Últimamente me estoy volviendo cada vez más suscriptor de los principios "puristas" de DI/IOC al diseñar/desarrollar. Parte de esto (una gran parte) implica asegurarse de que haya poco acoplamiento entre mis clases, y que sus dependencias se resuelvan a través del constructor (sin duda hay otras formas de manejar esto, pero se entiende la idea).
Mi premisa básica es que los métodos de extensión violan los principios de DI/IOC.
creé el siguiente método de extensión que utilizo para asegurar que las cuerdas se insertan en las tablas de bases de datos se truncan al tamaño correcto:
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);
}
}
A continuación, puedo llamar a mi cadena desde dentro de otra clase, así:
string myString = "myValue.TruncateThisPartPlease.";
myString.TruncateToSize(8);
una traducción de esta justa sin necesidad de utilizar un método de extensión sería:
string myString = "myValue.TruncateThisPartPlease.";
StaticStringUtil.TruncateToSize(myString, 8);
Cualquier clase que utilice cualquiera de los ejemplos anteriores no se pudo probar independientemente de la clase que contiene el método TruncateToSize (TypeMock a un lado). Si yo no estuviera usando un método de extensión, y yo no quiero crear una dependencia estática, que se vería más como:
string myString = "myValue.TruncateThisPartPlease.";
_stringUtil.TruncateToSize(myString, 8);
En el último ejemplo, la dependencia _stringUtil se resolvería a través del constructor y la clase podría probarse sin dependencia de la clase real del método TruncateToSize (se podría burlar fácilmente).
Desde mi punto de vista, los primeros dos ejemplos se basan en dependencias estáticas (uno explícito, uno oculto), mientras que el segundo invierte la dependencia y proporciona un acoplamiento reducido y una mejor capacidad de comprobación.
Entonces, ¿el uso de métodos de extensión está en conflicto con los principios de DI/IOC? Si es un suscriptor de la metodología IOC, ¿evita utilizar métodos de extensión?
¡Su método de extensión no verifica la entrada nula! – canon
@antisanity: AFAIK es lógicamente imposible que el parámetro de instancia de un método de extensión (* input * en este caso) sea nulo. –
Sí, Phil ... puede ser nulo. – canon