Ho un prodotto con due applicazioni separate. Il nucleo del prodotto vive nel database (oracle) e funziona secondo un programma. L'altra è un'applicazione client (attualmente ASP.NET MVC3) utilizzata per gestire l'applicazione di database. Ci sono tre livelli di convalida in corso; client, lato server e database prima che i dati del client vengano salvati nel database.
Tuttavia, ci sono casi in cui pezzi del set di dati sono attualmente validi ma potrebbero diventare non validi in futuro. In questi casi invece di interrompere l'intero (lungo) processo di input dei dati, basta mettere in attesa il processo per il set di dati finché i dati non diventano validi o vengono aggiornati ad un valore valido. L'errore potrebbe essere qualcosa come: "Ehi, hai programmato il processo di copia dei dati Foo nella posizione X, e poi concedi l'accesso all'utente Bob. L'account utente Bob che hai selezionato originariamente non è più valido, cosa ti piacerebbe fare?" Annulla la richiesta di copia "Cambia l'utente" o "Attendi".
Esiste una best practice per archiviare e riportare le condizioni di errore (risolvibili dall'utente) e le eccezioni (non fatali e non riparabili dall'utente) al client dal database?
Ad esempio:
- Il database avvia il processo A
- Il database seleziona il set di dati Foo
- Durante il processo si verifica un errore o un'eccezione
- Il database memorizza l'errore o l'eccezione
- Il database gestisce l'interruzione per il processo A con il set di dati Foo
- Il database continua il processo A con il set di dati successivo fino a quando non vengono elaborati tutti i set di dati
- Il database completa il processo A
Poi qualche tempo dopo:
- L'utente accede all'applicazione client in un secondo momento (dopo il fine settimana?)
- L'utente riceve una notifica che si è verificato un errore o un'eccezione
Il mio primo pensiero è una sorta di tabella db che memorizza vari campi (event_ time_stamp, process, event, object_type, object_pk, event_code, additional_details, status, last_updated). Quindi impostando i modelli lato client (vale a dire codificati con i parametri) per ogni codice di errore e presentandoli all'utente ... ma ci deve essere un modo migliore?
Idealmente sto cercando una soluzione che permetta al cliente di fornire utili opzioni UI che aiuteranno l'utente a risolvere eventualmente gli errori.
Quali soluzioni hai trovato a questo problema? Funzionerebbe qualcosa come NServiceBus o MassTransit?
EDIT: Ci sono due diversi requisiti qui. Il primo a memorizzare le eccezioni e il secondo a segnalare (e eventualmente a intervenire) su di loro.