1.È questo dove dovrei generare eccezioni? (non mi sembra un caso eccezionale, quindi penso di no ma potrei sbagliarmi).
Personalmente, ritengo che si dovrebbe restituire un oggetto con un risultato così come eventuali errori di convalida, e non un'eccezione per la validazione dei dati, se questo è a causa di informazioni (convalida formato) o la convalida logica di business mancante. Tuttavia, io suggerisco di un'eccezione per gli errori che non sono legati ai dati in sé - vale a dire: se il database non commettere con dati validi, ecc
Il mio pensiero è che mancanza di convalida non è un "avvenimento eccezionale" . Personalmente ritengo che tutto ciò che un utente può rovinare semplicemente inserendo dati sufficienti/corretti/ecc. È qualcosa che non è eccezionale - è una pratica standard, e dovrebbe essere gestita direttamente dall'API.
Le cose non correlate a ciò che l'utente sta facendo (ad es. Problemi di rete, problemi del server, ecc.) Sono eventi eccezionali e garantiscono un'eccezione.
2. Dovrei utilizzare void e un parametro "out"? Se sì, che tipo dovrebbe essere?
3. Dovrei utilizzare un tipo di ritorno dell'oggetto e inserire i dati in quello che succede?
Personalmente preferisco la terza opzione. i parametri "out" non sono molto significativi. Inoltre, desideri restituire più di una singola informazione di stato da questa chiamata: ti consigliamo di restituire informazioni sufficienti per contrassegnare le proprietà appropriate come non valide, oltre a tutte le informazioni sull'intero funzionamento.
Probabilmente richiederà una classe che contenga almeno uno stato di commit (successo/formato non riuscito/logica aziendale non riuscita/ecc.), Un elenco di mappature per proprietà-> errori (es .: IDataErrorInfo informazioni di stile) e potenzialmente un elenco di errori che non sono legati a una proprietà specifica, ma riguardano piuttosto la logica di business dell'operazione nel suo complesso o la combinazione di valori di proprietà suggeriti.
4. Qualche altra opzione che ho perso completamente?
L'altra opzione, che mi piace un po ', è quella di avere la convalida in un assembly separato dal livello di elaborazione aziendale. Ciò consente di riutilizzare la logica di convalida sul lato client.
Il bello di questo è che è possibile semplificare e ridurre drasticamente il traffico di rete. Il cliente può pre-validare le informazioni e inviare solo i dati attraverso il filo se è valido.
Il server può ricevere i dati validi e riconvalidarli e non restituire altro che un singolo risultato di commit. Credo che questo dovrebbe avere almeno tre risposte: successo, non riuscita a causa della logica di business o non riuscita a causa della formattazione. Questo dà sicurezza (non devi fidarti del client) e dà al cliente informazioni su ciò che non viene gestito correttamente, ma evita di passare entrambe le informazioni errate da client-> server e le informazioni di convalida da server-> client, quindi può ridurre drasticamente il traffico.
Il livello di convalida può quindi (in modo sicuro) inviare le informazioni al livello CRUD da inviare.
Grazie per aver dedicato del tempo a scrivere una risposta così dettagliata. Qual è, secondo te, l'opzione migliore per la maggior parte dei casi? Sembra che il # 3 sia molto popolare tra le altre risposte, sarebbe d'accordo che sia la migliore soluzione "catch all"? Specail baring o casi limite dispari? – Nate
Se sei preoccupato per il traffico, la mia opzione 4 è una variante su 3 che fornisce un'alternativa "migliore", IMO. Rende anche la convalida sul lato client un gioco da ragazzi. Altrimenti, l'opzione 3 è la mia preferita. –