Проверять можно на всех уровнях.
1) Контроллеры MVC -
FluentValidation
2) Далее все через
контракты.
Через IoC обертываем все в интерфейсы, и далее:
[ContractClass(typeof(IArrayContract))]
public interface IArray
{ контракт }
[ContractClassFor(typeof(IArray))]
internal abstract class IArrayContract : IArray
{ проверка входных и выходных параметров контрактов }
+ проверки на интерфейсах можно включать и выключать на вкладке свойств проекта, 4 уровня проверки.
+ проверки внедряются во все типы реализующие контракт.
- нельзя просто так взять и перехватить тип исключения от контракта, придется ловить все.
Из BBL не выкинишь HTTP ошибку, придется либо делать фильтр, либо ловить их в каждом методе и через switch кидать, но это не очень.