Interfaces y Diferentes contextos de Datos
El otro dÃa en el trabajo se nos presento un problema, tenÃamos una librerÃa que se encargaba de convertir un XML de un cliente a un formato interno nuestro, esta librerÃa era compartida por varias de nuestras aplicaciones, resulta que el cliente hace un cambio de especificaciones por lo que necesitamos acceder a unos datos históricos a fin de poder seguir convirtiendo su XML a nuestro formato, pero el modo y de donde obtener esos datos cambia según en el contexto en el que se este ejecutando la DLL.
La solución, añadirle un parámetro al método de conversión, un Interface que sea el que encargado de obtener esos datos, luego en cada contexto le pasamos la clase que nos interese que tiene que implementar el Interface.
Un Ejemplo en PseudoCodigo
//El interface que usaremos para obtener los datos public interface IObtenerLosDatos { XmlDocument DameLosDatos(); } //El metodo que convierte el XML public XmlDocument ConvierteXml(XmlDocument xmlDoc, IObtenerLosDatos BuscardorDatos) { XmlDocument xDatosHistoricos = BuscardorDatos.DameLosDatos(); //Codigos //Codigos //Codidos return new XmlDocument(); } //Una clase para obtener el historico desde el disco public class DatosDesdeDisco: IObtenerLosDatos { public XmlDocument DameLosDatos() { XmlDocument xmlDocument = new XmlDocument(); xmlDocument.Load(@"C:\Historico.xml"); return xmlDocument(); } } //Una clase para obtener el historico desde la base de datos public class DatosDesdeSQL: IObtenerLosDatos { public XmlDocument DameLosDatos() { XmlDocument xmlDocument = SqlHelper.Instance.GetXmlDocument(); return xmlDocument; } } //Convertimos el XML static void Convierte(XmlDocument xmlCliente) { Program p = new Program(); //Convertimos el XMl con el Historico desde Disco DatosDesdeDisco datosDesdeDisco = new DatosDesdeDisco(); XmlDocument xmlConvertido1 = p.ConvierteXml(xmlCliente, datosDesdeDisco); //Convertimos el XMl con el Historico desde SQL DatosDesdeSQL datosDesdeSQL = new DatosDesdeSQL(); XmlDocument xmlConvertido2 = p.ConvierteXml(xmlCliente, datosDesdeSQL); }


