Supongamos que tenemos un método de servicio que realiza algunas comprobaciones de seguridad, recupera datos de DB y de un servicio web de terceros, construye MyDataDTO
, escribe una entrada de auditoría en DB. Y queremos códigos de error granulares bien estructurados, ¿no? Somos buenos muchachos y siga las pautas de tratamiento de errores estándar de WCF:Contratos de falla de WCF en el mundo real
[FaultContract(typeof(AccessDenied))]
[FaultContract(typeof(KeyNotFound))]
[FaultContract(typeof(WsFault))]
[FaultContract(typeof(DbFault))]
MyDataDTO GetData(string key);
Ahora vamos a añadir un nuevo método que actualiza los datos. El método llama al GetData()
internamente (o parte principal de él), realiza la validación y agrega actualizaciones a los datos. Por lo tanto, debe tener todos los fallos de GetData()
duplicado además añadir sus propias faltas:
[FaultContract(typeof(InvalidState))]
[FaultContract(typeof(DataNotValid))]
[FaultContract(typeof(AccessDenied))]
[FaultContract(typeof(KeyNotFound))]
[FaultContract(typeof(WsFault))]
[FaultContract(typeof(DbFault))]
void UpdateData(MyDataDTO data);
Hasta aquí todo bien. Esto nos permite incluso generar documentación XML que podemos proporcionar a los consumidores de nuestro servicio para que sepan qué códigos de error pueden esperar.
Ahora imagina que tenemos 10 servicios con 10 métodos como los anteriores (o incluso más complejos) cada uno. Y la definición de todos los contratos de fallo se convierte en pesadilla ya que este es un proceso muy propenso a errores:
- No hay manera de definir anomalías generales (como DbFault) para todo el servicio de
- No se puede garantizar que un fallo definido en un contrato de operación realmente ser devuelto (cuestiones de copiar y pegar)
- no se puede garantizar que no se pierda alguna falta agregar al contrato de operación
no hay que tener en versiones interfaz de la cuenta aquí :)
Por lo tanto, usted se hizo una idea si apoya los servicios de WCF en producción. ¿Deberíamos abandonar los contratos de falla y usar un buen viejo estilo C (como tener la clase base DTOBase
con propiedad ErrorCode)? Reducir la granularidad de error? ¿Cómo asegurarse de que la documentación sea correcta/esté actualizada? Estoy interesado en algunas mejores prácticas.
Una cosa que debe preguntarse es si sus clientes realmente usarán esos códigos de error granulares. ¿Tomarán en realidad acciones diferentes en función de la falla que se devuelve, o solo mostrarán el mensaje de error? –
Muestra en su mayoría. Esto es para un diagnóstico de problemas más rápido en lugar de diferentes acciones. – UserControl
Entonces solo necesitas un solo FaultContract que contenga una cadena de 'Mensaje'. –