... however this is more challenging because it is necessary to recompile and deploy. Therefore I am wandering if the business logic should be contained in the database ...
Hai un punto, ma copre solo parte della logica.
Sì, l'età è solo un numero e quindi dati. Se l'età cambia da 18 a 21, può essere gestita con un semplice cambiamento di configurazione. Ma quanto sei sicuro che quell'età sia solo un numero?
Ad esempio, se l'età minima cambia per alcuni degli utenti (ad esempio in base alla loro nazionalità o genere), non è più così semplice. Dovresti quindi avere impostazioni di configurazione per ogni combinazione di nazionalità / genere, che può portare a un sacco di gonfiore nei tuoi file di configurazione. Ogni volta che viene aggiunta una nazionalità (che probabilmente accadrà a runtime senza bisogno di una ridistribuzione), sarà necessario aggiungere anche le nuove impostazioni di configurazione della nazionalità.
Il fatto è che le modifiche alle regole di convalida non sono sempre così semplici come la modifica di un valore. Quando alcuni dei comportamenti cambiano, sarai sempre bloccato a dover ridistribuire la tua applicazione. Anche se assicuri che tutti i valori siano facilmente configurabili, copre solo un sottoinsieme di possibili modifiche che possono essere apportate alla logica aziendale.
La domanda diventa quindi se il vantaggio di essere in grado di scambiare i valori (ma non la logica) contribuisca significativamente all'applicazione. Se la modifica di qualsiasi alle regole di convalida deve essere considerata una modifica con un impatto maggiore, non c'è motivo di garantire che le modifiche ai valori siano notevolmente più semplici delle modifiche logiche.
In secondo luogo, avere le impostazioni nella compilazione significa che hai una qualche forma di garanzia di coerenza. Se si compila l'età minima nella DLL, allora si sa che la stessa versione dell'applicazione non modificherà mai il suo comportamento. Soprattutto per sistemi di grande importanza come il banking, può essere desiderabile aggiungere uno strato di immutabilità comportamentale.
Indipendentemente dalle convalide aziendali, avrai sempre un ambiente di produzione sicuro perché vuoi impedire alle persone di scambiare impunemente le DLL (sia che si tratti di intenti malevoli o di manutenzione imprudente). Se hai comunque quella sicurezza, avere le regole di convalida compilate nella tua DLL significa che hai lo stesso ambiente sicuro per garantire che nessuno cambi le regole di convalida (che si tratti di intento malevolo o errore umano).
Alla fine, se si mettono le regole di convalida nel database, nel file di configurazione o nei cardini di assemblaggio su una domanda: Vuoi poter cambiare le regole di convalida senza ridistribuire l'applicazione?
Non esiste una risposta obiettivamente superiore a questa domanda. Diverse aziende hanno priorità diverse e diversi tipi di convalida possono avere impatti diversi sul business quando qualcosa va storto.