Patrón 3: Puertos y Adaptadores - JuanHerreraP/Proyecto-MISO-Solventa-Grupo-11 GitHub Wiki
Problema
Solventa depende de múltiples proveedores externos:
- Open Finance.
- Open Data.
- KYC y validación de identidad.
- Pasarelas de pago.
- Firma electrónica.
- Telemetría e IoT.
Cada proveedor utiliza contratos, formatos, protocolos y mecanismos de autenticación diferentes. Si los servicios del dominio consumieran directamente estas APIs, cualquier cambio de proveedor afectaría la lógica de perfilamiento, pagos, identidad, pólizas o siniestros.
Solución
Se utiliza el patrón Puertos y Adaptadores para separar los servicios del dominio de las tecnologías externas. Los puertos son interfaces internas que expresan las operaciones requeridas por Solventa, sin depender de un proveedor particular. Los adaptadores implementan estas interfaces y traducen entre el modelo interno de Solventa y el contrato de cada proveedor.
Aplicación en Solventa
El servicio de Perfilamiento solicita información financiera mediante un puerto interno. El adaptador de Open Finance convierte la solicitud al formato del proveedor y transforma su respuesta al modelo común de Solventa.
De manera similar:
- Identidad utiliza el adaptador KYC.
- Pagos utiliza el adaptador de la pasarela.
- Pólizas utiliza el adaptador de firma electrónica.
- Siniestros utiliza el adaptador de telemetría.
- Perfilamiento utiliza adaptadores de Open Finance y Open Data.
Los servicios del dominio no conocen las URLs, SDK, credenciales o formatos específicos de los proveedores.
Razonamiento
El patrón fue seleccionado porque una parte importante de Solventa depende de servicios que se encuentran fuera de su control.
Aislarlos detrás de interfaces estables permite sustituir proveedores, incorporar nuevas fuentes de datos y utilizar simuladores durante las pruebas sin modificar los servicios consumidores.
También reduce el riesgo de que cambios regulatorios o tecnológicos se propaguen por toda la aplicación.
Relación con los ASR
- EC06 – Facilidad de modificación: permite cambiar el proveedor de KYC o pagos sin modificar los componentes consumidores.
- EC07 – Seguridad: concentra la autenticación y protección de las comunicaciones externas.
- EC12 – Disponibilidad: permite aplicar mecanismos de degradación ante la caída de un proveedor.
- EC14 – Facilidad de integración: permite incorporar nuevas fuentes de Open Finance u Open Data sin afectar el motor de perfilamiento.
- EC13 – Integración de socios: ayuda a traducir contratos externos al modelo interno de Solventa.
Ventajas
- Facilita sustituir proveedores.
- Evita cambios en los servicios del dominio.
- Permite agregar nuevas fuentes de información.
- Simplifica las pruebas mediante simuladores.
- Centraliza la transformación de formatos externos.
- Reduce el acoplamiento tecnológico.
Limitaciones
- Requiere mantener una interfaz y un adaptador por integración.
- Agrega código de transformación.
- Puede ocultar capacidades particulares de algunos proveedores.
- Las interfaces deben diseñarse cuidadosamente para mantenerse estables.
Para controlar estos riesgos, los puertos tendrán operaciones pequeñas y orientadas a las necesidades del negocio, no a las características particulares de cada proveedor.
Diagrama
flowchart TB
subgraph Domain["Servicios del dominio"]
Identity["Identidad y Consentimiento"]
Risk["Perfilamiento"]
Payments["Cobros y Pagos"]
Policies["Pólizas"]
Claims["Siniestros"]
end
subgraph Ports["Puertos internos"]
KYC_P["IdentityVerificationProvider"]
Finance_P["FinancialDataProvider"]
Data_P["PublicDataProvider"]
Payment_P["PaymentProvider"]
Signature_P["ElectronicSignatureProvider"]
Telemetry_P["TelemetryProvider"]
end
subgraph Adapters["Adaptadores"]
KYC_A["Adaptador KYC"]
Finance_A["Adaptador Open Finance"]
Data_A["Adaptador Open Data"]
Payment_A["Adaptador de Pagos"]
Signature_A["Adaptador de Firma"]
Telemetry_A["Adaptador de Telemetría"]
end
subgraph External["Proveedores externos"]
KYC_E["Proveedor KYC"]
Finance_E["Open Finance"]
Data_E["Open Data"]
Payment_E["Pasarela de Pagos"]
Signature_E["Firma Electrónica"]
Telemetry_E["Telemetría / IoT"]
end
Identity --> KYC_P
Risk --> Finance_P
Risk --> Data_P
Payments --> Payment_P
Policies --> Signature_P
Claims --> Telemetry_P
KYC_P --> KYC_A
Finance_P --> Finance_A
Data_P --> Data_A
Payment_P --> Payment_A
Signature_P --> Signature_A
Telemetry_P --> Telemetry_A
KYC_A --> KYC_E
Finance_A --> Finance_E
Data_A --> Data_E
Payment_A --> Payment_E
Signature_A --> Signature_E
Telemetry_A --> Telemetry_E