Una delle cose di cui non sono mai stato soddisfatto in nessun progetto su cui ho lavorato nel corso degli anni e che non sono stato in grado di risolvere personalmente è esattamente in quale livello di un'applicazione devono essere recuperate le informazioni di errore leggibili dall'uomo per la visualizzazione a un utente.
Un approccio comune che ha funzionato bene è stato restituire "oggetti risultato" strongmente tipizzati / concreti dai metodi sulla superficie pubblica del livello aziendale / API. Un metodo sull'interfaccia potrebbe essere:
public ClearUserAccountsResult ClearUserAccounts(ClearUserAccountsParam param);
E l'implementazione della classe di risultati:
public class ClearUserAccountsResult : IResult
{
public readonly List<Account> ClearedAccounts{get; set;}
public readonly bool Success {get; set;} // Implements IResult
public readonly string Message{get; set;} // Implements IResult, human readable
// Constructor implemented here to set readonly properties...
}
Funziona alla grande quando l'API deve essere esposta su WCF poiché l'oggetto risultato può essere serializzato. Ancora una volta questo viene fatto solo sulla superficie pubblica del livello API / business. Il messaggio di errore può anche essere cercato dal database, il che significa che può essere modificato e localizzato.
Tuttavia, è sempre stato sospetto per me, questa idea di restituire informazioni leggibili dal livello aziendale come questo, in parte perché ciò che costituisce la superficie pubblica dell'API può cambiare nel tempo ... e potrebbe essere il caso che l'API dovrà essere riutilizzata da altri componenti API in futuro che non necessitano dei messaggi di stringa leggibili dall'uomo (e cercarli da un database sarebbe uno spreco costoso).
Penso che un approccio migliore sia quello di mantenere gli oggetti di business liberi da tali oggetti risultanti e mantenerli semplici e quindi recuperare stringhe di errore leggibili dall'uomo in qualche modo più vicino al livello dell'interfaccia utente o solo nell'interfaccia utente stessa, ma qui ho due problemi :
1) L'interfaccia utente può essere un client remoto (Winforms / WPF / Silverlight) o un'applicazione Web ASP.NET ospitata su un altro server. In questi casi l'interfaccia utente dovrà recuperare le stringhe di errore dal server.
2) Spesso ci sono molteplici modi legittimi di fallimento. Se il livello aziendale diventa così vago e generico nel modo in cui restituisce errori, potrebbero non esserci sufficienti informazioni esposte pubblicamente per indicare l'errore effettivo: es .: se un metodo ha 3 modi di errore legittimo ma restituisce un valore booleano per indicare un errore, non puoi capire quale dovrebbe essere il messaggio appropriato da mostrare all'utente.
Ho pensato di usare le enumerazioni fallite come sostituto, possono indicare un errore specifico che può essere testato e codificato. A volte ciò è utile all'interno del livello aziendale in quanto un modo di passare tramite il metodo restituisce le specifiche di un errore piuttosto che solo un valore booleano, ma non è così buono per gli scenari di serializzazione.
C'è uno schema ben indossato per questo? Cosa pensa la gente?
Grazie.