Supponendo che, nonostante il ragionevole dubbio avanzato nella risposta di VoiceOfUnreason, la regola aziendale sia stata decisa, come la tua domanda presuppone.
Quindi la semplice risposta è che nessun sistema dovrebbe fidarsi del suo input , specialmente (ma non esclusivamente) quando l'input proviene da un utente umano.
Quindi convalidare su ogni livello.
Se si persistono i dati, è necessario implementare questo controllo nel modello dati e gestire le eccezioni nel proprio DAL (livello di accesso ai dati). Da lì, puoi generare eccezioni per essere catturate dal tuo BLL (livello logico aziendale) che utilizza quel DAL.
Il tuo livello dominio dovrebbe implementare anche la regola aziendale nel suo modello. A volte il dominio viene generato almeno in parte dal modello di dati, quindi finirà automaticamente lì. Di nuovo, puoi lanciare un'eccezione se la regola è violata.
Anche il servizio WCF può generare un'eccezione. Questo è ampiamente considerato una buona cosa, purché tu descriva le possibili eccezioni che il tuo servizio potrebbe comportare nel tuo contratto di servizio.
Ora hai protetto il tuo back-end dai dati corrotti, ma vorrebbe dire che devi chiamare il tuo servizio WCF dopo l'input dell'utente, solo per scoprire che c'è un errore. È prassi comune convalidare l'input dell'utente sul front-end senza prima chiamare i servizi back-end, se tale convalida può essere effettuata in base all'input dell'utente stesso (il controllo per un nome utente esistente non può essere fatto come quello, ovviamente, ma verificare se una data di inizio si trova prima di una data di fine è comune).
Questo puoi facilmente fare nel modello della tua applicazione, usando, ad esempio, annotazioni di dati e validazione. In questo caso, fornisci i messaggi di convalida che devono essere inviati all'utente finale.
Prima di inviare i dati utente al servizio WCF, convalidi i dati e, se c'è un errore di convalida, lo comunichi all'utente.