Как создать поведение fubumvc для переноса исключений? - PullRequest
3 голосов
/ 23 марта 2010

Как я могу создать поведение fubumvc, которое упаковывает действия с определенным типом возврата, и если при выполнении действия возникает исключение, то это поведение регистрирует исключение и заполняет некоторые поля возвращаемого объекта?Я пробовал следующее:

public class JsonExceptionHandlingBehaviour : IActionBehavior
{
    private static readonly Logger logger = LogManager.GetCurrentClassLogger();
    private readonly IActionBehavior _innerBehavior;
    private readonly IFubuRequest _request;

    public JsonExceptionHandlingBehaviour(IActionBehavior innerBehavior, IFubuRequest request)
    {
        _innerBehavior = innerBehavior;
        _request = request;
    }

    public void Invoke()
    {
        try
        {
            _innerBehavior.Invoke();

            var response = _request.Get<AjaxResponse>();
            response.Success = true;
        }
        catch(Exception ex)
        {
            logger.ErrorException("Error processing JSON request", ex);

            var response = _request.Get<AjaxResponse>();
            response.Success = false;
            response.Exception = ex.ToString();
        }
    }

    public void InvokePartial()
    {
        _innerBehavior.InvokePartial();
    }
}

Но, хотя я получаю объект AjaxResponse из запроса, все сделанные мной изменения не отправляются обратно клиенту.Кроме того, любые исключения, выданные действием, не делают это, насколько это, запрос прекращается, прежде чем выполнение попадает в блок catch.Что я делаю не так?

Для полноты, поведение в моей WebRegistry связано со следующим:

Policies
    .EnrichCallsWith<JsonExceptionHandlingBehaviour>(action =>
        typeof(AjaxResponse).IsAssignableFrom(action.Method.ReturnType));

А AjaxResponse выглядит так:

public class AjaxResponse
{
    public bool Success { get; set; }
    public object Data { get; set; }
    public string Exception { get; set; }
}

1 Ответ

2 голосов
/ 23 марта 2010

Это не будет работать с текущей версией FubuMVC, к сожалению. Причина в том, что вызов _innerBehavior.Invoke () будет продолжаться по остальной части цепочки поведения, включая вызов для визуализации вывода JSON обратно клиенту.

С текущим FubuMVC вы не можете обернуть поведение и изменить его вывод перед выполнением поведения вывода рендеринга.

Я только что говорил с Джереми (Миллером) об этом, и мы собираемся добавить эту возможность в FubuMVC, чтобы вы могли обернуть определенное поведение (в данном случае, поведение, которое вызывает действие) вместо обертывания всего поведения. цепь (что и происходит с вами сейчас).

Я прокомментирую этот вопрос StackOverflow, когда мы добавим эту функцию.

...