Per me, il posto migliore per controllarlo è in due punti. Prima sull'interfaccia utente (livello di presentazione), assicurati che i dati immessi soddisfino i requisiti di base. Ad esempio, un utente deve inserire una data in una casella di testo, il livello di presentazione dovrebbe assicurarsi che il valore inserito sia effettivamente una data.
Il secondo posto sarebbe il livello di servizio o, a seconda dell'architettura, il livello aziendale. I dati immessi nell'interfaccia utente verrebbero inseriti in un oggetto e inviati al livello di servizio (o al livello aziendale), che imporrebbe le regole aziendali. Ad esempio, la data inserita deve essere successiva al giorno corrente. Altri tipi di convalida possono verificarsi anche qui, senza voci duplicate e così via.
Una volta che i dati sono stati convalidati dal livello di servizio, questo verrà inviato al repository (o al livello di accesso ai dati) da inserire nel database. Non sono un grande fan di mettere la validazione sul database. Principalmente perché è quasi impossibile eseguire il test dell'unità in modo corretto. Il tipo di convalida fatto su un database dovrebbe essere limitato per garantire l'integrità della chiave esterna o gli indici univoci.