51 messaggi dal 17 maggio 2011
Ciao a tutti,

Volevo avere un confronto con vuoi su un'abitudine che sto prendendo e che non so sia sana o meno.

Ho una classe Plant, il quale ha una proprietà di navigazione PlantType che ha una proprietà MaxMeter che indica quanti meter massimi possono essere agganciati a plant percui
public class Plant
{
.....
public virtual PlantType PlantType { get; set; }
public virtual ICollection<Meter> Meters { get; set; }
}


Quando io accedo a al metodo get Create del controller Meter gli passo ID del plant con il quale leggo da db il tipo di plant, quanti meter ha e li decido se visualizzare la view create meter oppure redirect verso la pagina da cui è partito valorizzando TempData["Error"].

Le cose su cui sono mi faccio tante domande è: è corretto integrare una logica di controllo nel metodo get:create e sopratutto, quanto è brutta la metodologia di return degli errori utilizzando TempData.

Voi come gestite solitamente queste situazioni?

Ciao a tutti
Paolo
Modificato da fractals87 il 20 settembre 2019 12:21 -
11.862 messaggi dal 09 febbraio 2002
Contributi
Ciao,
non esistono soluzioni valide o sbagliate in senso assoluto. Ci sono invece soluzioni appropriate alla situazione e appropriate alla tua sensibilità e al tuo senso d'ordine personale.


è corretto integrare una logica di controllo nel metodo get:create

Personalmente preferisco mettere la logica di validazione in un servizio applicativo, cioè in un'altra classe che ha appunto la responsabilità di verificare se i dati in input sono corretti e, se sì, creare l'entità.
In questo modo evito di mettere codice nei Controller. Infatti, se lo metti in un'altra classe, lo potrai riutilizzare senza duplicazioni anche in altri punti dell'applicazione (o addirittura in applicazioni diverse, dato che quel codice non è più strettamente legato a concetti tipici di un'applicazione web, come un controller).

Nel caso in cui l'input dell'utente non fosse valido, allora il servizio applicativo potrebbe sollevare un'eccezione. La puoi catturare con un try catch dal metodo Create oppure a livello globale in questo modo.
https://github.com/BrightSoul/AspNetCoreWebApiErrorDemo/blob/master/Controllers/ErrorController.cs


oppure redirect verso la pagina da cui è partito valorizzando TempData["Error"].

L'oggetto TempData esiste ed è stato pensato per utilizzi come questo. Quindi se ti piace usarlo, usalo.

ciao,
Moreno

Enjoy learning and just keep making
51 messaggi dal 17 maggio 2011
Risposta cristallina.
Quando suggerisci la costruzione di un servizio applicativo ti riferisci ad un pattern specifico?
Ad esempio repository?
Nel caso non fosse repository ti spiace farmi un esempio semplice semplice o indicarmi un link che indichi ciò che intendi dire.

Grazie mille
Paolo
11.862 messaggi dal 09 febbraio 2002
Contributi
Ciao Paolo,


Quando suggerisci la costruzione di un servizio applicativo ti riferisci ad un pattern specifico?


No, hai la libertà di usare i pattern che preferisci. Per "servizio applicativo" intendo semplicemente una classe che "serve" informazioni per gli specifici casi d'uso dell'applicazione.

Hai bisogno di visualizzare il dettaglio di un prodotto? Bene, crea una classe ProductService che dentro abbia un metodo GetProductAsync che accetta l'id del prodotto e restituisce un ProductDetailViewModel (che passerai alla view).
public class ProductService
{
  public async Task<ProductDetailViewModel> GetProductAsync(string id)
  {
     ProductDetailViewModel viewModel;
     //Qui ho della logica (es. validazione dell'input, composizione di una query, mapping, ecc...)
     //TODO: ottengo informazioni dal db grazie a un servizio infrastrutturale
     return viewModel;
  }
}


I dettagli implementativi puoi deciderli tu. Un servizio applicativo serve solo a perseguire la separazione delle responsabilità.
- La responsabilità di un controller è solo quella di gestire la richiesta per raccogliere l'input dell'utente. Al massimo fa una validazione sintattica (es. campo richiesto);
- Un servizio applicativo si occupa di verificare se sussistono le condizioni per eseguire il comando richiesto dall'utente (es. vuole consultare il dettaglio di prodotto ma quel prodotto non esiste più nel database) e sfrutta dei servizi infrastrutturali (es. i repository) per recuperare informazioni dal db.

Ma ti consiglio di leggere questo. Martin Fowler spiega i concetti molto meglio e più approfonditamente di quanto non sarò mai in grado di fare io.
https://www.amazon.it/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420

ciao,
Moreno
Modificato da BrightSoul il 23 settembre 2019 10:29 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.