Ho un fastidioso odore di codice nella mia API di asp.net che sto passando in giro, e non riesco a trovare un modo per risolvere il problema.
In un'azione del controller MVC, di solito c'è una logica molto diretta, almeno nel mio caso.
- Convalidare il modello (prima di chiamare l'azione)
- dati rilevanti sulle query
- Esegui la logica aziendale
- Invia risposta
Ora in alcune azioni, la logica deve essere un po 'più complessa.
A volte, le convalide del modello richiedono una query al database.
L'utilizzo di FluentValidation di solito è sufficiente solo per iniettare la dipendenza richiesta e usarlo per interrogare il database - e poi avere il controller interrogare altri dati rilevanti.
Ora è qui che tutto viene incasinato, ho molte convalide del modello che richiedono gli stessi dati dell'azione del controller.
quindi, quello che faccio al momento, in questi casi mi sembra un codice olfattivo.
- Convalidare il modello, interrogando solo i dati che non sono richiesti dal controllore
- Interrogare i dati rilevanti e convalidare nel controller
- Esegui la logica aziendale
- Invia risposta.
Non mi piace l'idea di convalidare i dati all'interno del controller, poiché spesso si traduce in un'azione di 60 righe, la maggior parte delle quali è la convalida del modello e interrompe SOLID che potrebbe generare confusione man mano che l'app cresce.
L'opzione di interrogare i dati due volte sembra un'opzione estremamente negativa e sinceramente non vedo alcun motivo per sceglierli effettivamente.
Quindi la domanda è fondamentalmente, come suggerisci di convalidare BindingModels sul database?
Il metodo ideale per me sembra in qualche modo iniettare i dati interrogati all'implementazione di AbstractValidator (o qualsiasi altra classe responsabile della convalida), e al controller, e in questo modo riesco a mantenere la logica originale, senza interrogare gli stessi dati due volte. Tuttavia, sono abbastanza sicuro che l'implementazione è peggio.