Sto sviluppando progetti di tipo enterprise usando il pattern DDD. Ho seguito progetti nel mio C# soluzione:Come definire correttamente la strategia di eccezione nell'applicazione enterprise .NET con pattern DDD?
modello di dominio - progetto DLL
WebUI - ASP.NET progetto MVC3
DesktopUI - progetto WPF
DAL - Entity Framework Code First
Persistenza - Database server SQL
Questo progetto non è grande ma sto cercando di utilizzare tutte le buone pratiche delle applicazioni aziendali.
Quello che mi piacerebbe definire ora è la strategia delle eccezioni, ma non sono sicuro di come affrontarlo. Probabilmente dovrei usare Enterprise Library Exception Handling e Logging Blocks ma non sono sicuro di come inserirlo nell'immagine. Alcuni scenari concreti che sto cercando di risolvere nella mia testa sono i seguenti:
Se la nuova entità viene creata dall'utente nell'applicazione WPF, e il pulsante Salva viene cliccato come dovrebbe errore essere riportati e registrati nel caso un'eccezione si verifica a diversi livelli (ad esempio, l'entità non viene creata correttamente in base alle regole di dominio o si è verificato un errore durante il tentativo di persistere nuovo oggetto nel database)
L'utente tenta di recuperare l'entità sconosciuta dal database (ad esempio da WebUI specificando ID entità sconosciuta nell'URL)
Capisco che posso definire eccezioni personalizzate ma non sono abbastanza sicuro di dove e come. Dovrebbero essere definiti per ogni strato? So che esiste una pratica di eccezioni, ma ancora non sono sicuro di come utilizzare al meglio tale schema.
Inoltre, dovrei creare un'eccezione personalizzata per ogni errore in alcuni livelli (ad esempio UserAlreadyExistInDatabaseException per provare a salvare due utenti con la stessa email e UnknownUserDatabaseException se provo a ottenere un utente sconosciuto dal DB) o dovrei avere un tipo di eccezione che gestisce più errori di livello (ad esempio DatabaseException e quindi differenzia gli errori con proprietà personalizzate o proprietà Exception.Message).
Hai dichiarato: "Il servizio dell'applicazione incapsula il tuo dominio incluso il modello di dominio". Pertanto, l'interfaccia utente può accedere al tipo 'UserAlreadyExistInDatabaseException' poiché è incluso in esso. Ma se dividessimo i servizi applicativi in applicationervice-api.jar (interfacce, DTO ecc.) E applicationervice-impl.jar. Solo applicationervice-impl.jar avrebbe accesso a 'UserAlreadyExistInDatabaseException'. Pertanto, un'interfaccia utente che dipende solo da applicationervice-api.jar (disaccoppiamento) non potrebbe agire di conseguenza a questa eccezione ... A cosa pensi? – Mik378