首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Caliburn.Micro:从IResult中的异常恢复

Caliburn.Micro:从IResult中的异常恢复
EN

Stack Overflow用户
提问于 2011-02-03 06:57:15
回答 1查看 1.5K关注 0票数 2

这也被发布在Caliburn.Micro discussions上。我真的在寻找最好的解决方法的建议和意见。

假设我有以下操作

代码语言:javascript
复制
public IEnumerable<IResult> SaveStation()
{ 
    yield return Busy.MakeBusy();
    yield return new StationSave(_station);
    yield return Busy.MakeNotBusy();
    yield return Show.Tab<StationBrowseViewModel>();
}

StationSave是一个围绕简单服务调用的IResult包装器。该服务使用FaultContract/FaultException处理失败。

在发生故障的情况下,需要通知用户,并且FaultContract将包含一些关于哪里出了问题的有用信息。目前,保存结果捕获异常并将其插入到已完成事件的ResultCompletionEventArgs中。通过这样做,由管道创建的SequentialResult被取消(由于错误),从而使屏幕处于繁忙状态。

我真正追求的是关于从错误中恢复(删除忙状态)并通知用户(我有两个IResult实现,用于不同样式的通知,我想使用它们)在错误契约中提供的细节的最佳方法的想法。通过附加到VM中的Completed事件,我可以获得错误,但此时我不再处于操作管道的上下文中,因此我想要使用的任何IResults ( MakeNotBusy和我的显示通知实现)都必须手动执行(并且我必须更新我自己的ActionExecutionContext,而我不想这样做)。

我已经看过Marco Amendola从here中为Caliburn.Micro设置的救援过滤器,但是我仍然不能从rescue方法中传回IResults。

我是不是漏掉了什么明显的东西?其他人如何处理这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-09 10:39:22

Rob EisenbergMarco Amendola都在CodePlex forum中提供了可能的解决方案。

我选择将Marco的RescueAttribute从他的filters implementation中提取出来,并对其稍作修改,以允许执行来自救援方法的更多IResult。这是对RescueAttribute.HandleException所需的更改

代码语言:javascript
复制
protected override bool HandleException(ActionExecutionContext context,
                                        Exception ex)
{
    var method = context.Target
                        .GetType()
                        .GetMethod(MethodName, new[] { typeof(Exception) });
    if (method == null) return false;

    try
    {
        var result = method.Invoke(context.Target, new object[] { ex });

        if (result is bool)
            return (bool) result;

        if (result is IResult)
            result = new[] { result as IResult };
        if (result is IEnumerable<IResult>)
            Coroutine.Execute(((IEnumerable<IResult>) result).GetEnumerator(), context);
        else if (result is IEnumerator<IResult>)
            Coroutine.Execute(((IEnumerator<IResult>) result), context);

        return true;
    }
    catch
    {
        return false;
    }
}

这允许在我的VM中执行以下操作:

代码语言:javascript
复制
public IEnumerable<IResult> Rescue(Exception ex)
{
    yield return Busy.MakeNotBusy();
    // in practice pass exception details through to notification
    yield return new NotificationPopup("Save station failed");
}

[Rescue]
public IEnumerable<IResult> SaveStation()
{ 
    yield return Busy.MakeBusy();
    yield return new StationSave(_station);
    yield return Busy.MakeNotBusy();
    yield return Show.Tab<StationBrowseViewModel>();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4880918

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档