Мне нравится возвращать стандартный контракт на уровень пользовательского интерфейса из бизнес-уровня.
Это выглядит так:
public class ServiceOperationResult<T>
{
public bool Successful
{
get;
set;
}
public ServiceErrorType ErrorType
{
get;
set;
}
public string ErrorMessage
{
get;
set;
}
public T ReturnData
{
get;
set;
}
}
Я использую дженерики, чтобы каждая служба могла определить, что она отправляет обратно, а стандартные флаги ошибок сообщают клиентскому приложению, какой тип ошибки произошел (это мета-тип, такой как «Внутренняя ошибка», «Ошибка внешней стороны» , «Ошибка проверки бизнес-правила»), и приложение может затем стандартным образом реагировать на эти типы ошибок.
Например, бизнес-ошибки отображаются в красной метке ошибки, а внутренние ошибки перенаправляются на страницу ошибок (в веб-приложении) или закрывают форму (в приложении Windows)
Моя ненависть к домашним животным - видеть красную метку на веб-сайте (где я ожидаю увидеть ошибки проверки) и видеть что-то вроде «Сервер базы данных отклонил ваше соединение». Это риск того, что вы запускаете, используя только строку для возврата данные об ошибках.