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

2024-03-07

这是张贴在Caliburn.Micro 讨论 http://caliburnmicro.codeplex.com/Thread/View.aspx?ThreadId=244394还。我真的在寻找有关最佳解决方法的建议和意见。

假设我有以下操作

public IEnumerable<IResult> SaveStation()
{ 
    yield return Busy.MakeBusy();
    yield return new StationSave(_station);
    yield return Busy.MakeNotBusy();
    yield return Show.Tab<StationBrowseViewModel>();
}

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

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

我真正想要的是从错误中恢复(删除繁忙状态)并通知用户(我有几个 IResult 实现用于不同样式的通知,我想使用)详细信息的最佳方法的想法过错合同中规定。通过附加到虚拟机中的 Completed 事件,我可以获得错误,但此时我不再处于操作管道的上下文中,因此我想要使用的任何 IResults(MakeNotBusy 和我的显示通知实现)我必须手动执行(我必须新建我自己的 ActionExecutionContext,但我不想这样做)。

我看过 Marco Amendola 的 Caliburn.Micro 救援过滤器here http://marcoamendola.wordpress.com/2010/08/10/a-caliburn-micro-recipe-filters/,但我再次无法从 Rescue 方法传回 IResults。

我错过了一些明显的事情吗?其他人如何处理这种情况?


Both 罗布·艾森伯格 http://devlicio.us/blogs/rob_eisenberg/ and 马可·阿门多拉 http://marcoamendola.wordpress.com/中提供了可能的解决方案CodePlex 论坛 http://caliburnmicro.codeplex.com/Thread/View.aspx?ThreadId=244394.

我选择了Marco的RescueAttribute从他的过滤器的实现 http://marcoamendola.wordpress.com/2010/08/10/a-caliburn-micro-recipe-filters/并稍微修改它以允许进一步执行IResult从救援方法来看。这是所需的更改RescueAttribute.HandleException

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;
    }
}

这允许在我的虚拟机中执行以下操作:

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>();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Caliburn.Micro:从 IResult 中的异常中恢复 的相关文章

  • asp:repeater 折叠表行 - 已更新

    我想知道是否有人对我的问题有创造性的解决方案 我有一个从我的数据库填充的转发器 如下所示
  • 使用遗留代码(使用reinterpret_cast)真的是一种很好的技术吗?

    下面的代码来自一篇关于C 面试问题的帖子here https www toptal com c plus plus interview questions 我从来不知道这种技术 尽管它声称是一种很好的技术 我的问题是 什么情况下需要使用它
  • Silverlight 中的应用程序范围字体资源

    我想看看是否可以在 Silverlight 控件中使用应用程序范围的字体 这些字体可以在 application resources 中设置 然后在整个应用程序中使用 他们不需要指定字体的其他内容 例如粗体或斜体 只需指定名称即可 大多数情
  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 如何在 ASP.NET MVC 中处理会话数据

    假设我想存储一个名为language id在会议中 我想我也许可以做如下的事情 public class CountryController Controller WebMethod EnableSession true AcceptVer
  • 二叉树和快速排序?

    我有一个家庭作业 内容如下 别生气 担心 我是not请你帮我做作业 编写一个程序 通过使用二分查找的快速排序方法对一组数字进行排序 树 推荐的实现是使用递归算法 这是什么意思 到目前为止 这是我的解释 正如我在下面解释的那样 我认为两者都有
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 来自同一基模板类的 C++ 重写函数,具有多重继承不明确的函数调用

    我需要打电话init int iNumber 从基类派生的函数 基类 h pragma once include stdafx h template
  • 对象变空似乎是 Hangfire 中的反序列化问题

    Hangfire 似乎无法反序列化我的原始版本Scheduler对象及其所有状态 我正在调用其 Execute 方法BackgroundJob Enqueue 如下所示 Scheduler new FileInFileOut FileIn
  • 对列表中的一系列整数求和

    假设我有一个这样的列表 List
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • ArrayList 有什么问题?

    最近我问了一个关于 SO 的问题 其中提到了可能使用 c ArrayList 来解决问题 有人评论说使用数组列表不好 我想了解更多有关此的信息 我以前从未听说过关于数组列表的这种说法 有人可以带我了解使用数组列表可能出现的性能问题吗 C n
  • 用 std::generate_n 填充 std::map

    我想填写一个std map using std generate n但无法让它发挥作用 我尝试过的是这样的事情 unsigned number of pairs 5 std map
  • 使用 StartServiceCtrlDispatcher 与 StartService 从 C 语言启动 Windows 服务有什么区别?

    我尝试使用 StartServiceCtrlDispatcher 中所述https msdn microsoft com en us library windows desktop bb540475 v vs 85 aspx https m
  • 在for循环中声明和初始化变量

    可以简单写一下吗 for int i 0 代替 int i for i 0 在 C 或 C 中 并且会变量i只能在循环内部访问 它在 C 中有效 它在 C 的原始版本中是不合法的 但在 C99 中被采用为 C 的一部分 当时一些 C 功能被
  • 如何正确处置注入的DLL线程?

    我将一个 DLL 注入到目标进程中 以在玩 MMORPG 时充当助手 当前功能将按键转换为鼠标点击 因为 MMORPG 要求用户移动鼠标才能实现某些功能 这是我所鄙视的 假设我出于某种原因想要取消注入 DLL 我该怎么做呢 这个方法干净吗
  • 将二进制长字符串转换为十六进制 C#

    我正在寻找一种将长二进制字符串转换为十六进制字符串的方法 二进制字符串看起来像这样 0110011010010111001001110101011100110100001101101000011001010110001101101011 我
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol

随机推荐

  • 如何查看 C# 数组在内存中的分布情况?

    我想看看 C 数组是如何存放在计算机内存中的 我想看到的主要是两列 第一列是地址 第二列是数组元素 是否可以 我想从一维数组开始 但然后我想观察多维数组是如何放置的 Question 我如何通过 Visual Studio 看到它 您可以使
  • 运行时错误:事件循环正在运行

    当我调用该函数时出现以下错误send message Exception in thread Thread 1 Traceback most recent call last File usr lib python3 4 threading
  • Camel SFTP - 无法将目录更改为“/”

    我需要通过 SFTP 连接到服务器 但收到此错误 INFO org apache camel component file remote SftpOperations connect Connected to sftp myserver c
  • 从 Powershell 中的对象数组中删除项目

    我有一个数组对象 a 它返回如下所示的输出 通过执行 a 0 Name 我可以访问每个 Name 条目 a 0 Available 我可以访问其相应的可用空间 我有另一个数组 b 包含一些名称 例如 b 返回两个名称 sandeep agg
  • 解释 - 不涉及反射

    我有一个非常简单的问题 这不仅适用于 Spray json 而且我读过 argonaut 和 circe 的类似声明 所以请赐教 在 Spray json 中 我遇到这样的声明 There is no reflection involved
  • 如何在没有 ID 的情况下在 Prisma 中更新插入新记录?

    我正在使用 Prisma https www prisma io https www prisma io 作为 ORM 我想在存储数据时检查重复项 如果不存在 则创建一条新记录 我想我可以使用 Prisma 提供的 upsert 方法来做到
  • underscore.js 中的 chain 函数是否创建了一个 monad?

    In the chain文档 http underscorejs org chaining你发现 Calling chain在包装对象上将导致所有未来的方法调用 也返回包装的对象 当你完成后 计算 使用value检索最终值 也是如此chai
  • OpenAPI中如何定义全局参数?

    我正在准备我的 API 文档 方法是手工完成 而不是自动生成 我有应该发送到所有 API 的标头 但不知道是否可以为整个 API 全局定义参数 其中一些标头是静态的 有些必须在调用 API 时设置 但它们在所有 API 中都是相同的 我不想
  • 创建字典时使用语言模型文件

    我创建了一个语音到文本识别应用程序 为此 我使用 CMULanguage 工具开发了一本字典 为了为我的项目创建字典 我在组和文件中的语言文件夹中添加了两个文件 这些文件的扩展名是 lm 语言模型 和 dic 当我上传我的语料库时 CMUL
  • Spring Data JPA JpaRepository.save(entity) 不返回数据库默认值

    我有一个相当简单的问题 在单个事务中 我的代码如下所示 MyClass c new MyClass c setPropA A c myClassRepository save c c setPropC C 我的实体如下所示 Entity T
  • 如何通过 Linq 查询 MongoDB 中的 BsonExtraElements

    我使用 mongodb BsonExtraElements 功能来扩展我的类的一些动态数据 但不幸的是我无法通过 mongodb C 驱动程序创建查询 这是我的模型类 public class MongoProductEntity publ
  • 无法检索 ApplicationUser 的元数据。 - VS13

    当我选择使用实体框架生成带有视图的 MVC5 控制器时 我收到以下错误 无法检索 ApplicationUser 的元数据 不支持每种类型的多个对象集 对象集 ApplicationUsers 和 Users 都可以包含 Applicati
  • 无法处理的 POSIX 信号的返回代码

    This is regarding the application that runs on POSIX Linux environment Most signals e g Ctrl C signal 2 SIGINT and few o
  • 计算圆内的坐标

    我正在按钮中间画一个假想的圆圈 圆的半径是Height 2 if Height gt Width or Width 2 if Width gt Height 现在我必须计算这个圆圈中有哪些坐标 以像素为单位 这个想法是 如果例如鼠标光标悬停
  • 如何在 NSUserDefaults 中保存 NSMutableArrays

    我有 4 个带有单独数据的 NSmutablearrays 现在我需要将它们单独保存在 NSuserdefaults 中并单独检索它们 我怎样才能做到这一点 任何人都可以发布一些代码吗 提前谢谢你 数组的内容是什么 虽然 NSUserDef
  • abs() 与 fabs() 速度差异以及 fabs() 的优势

    我对 abs 和 fabs 函数进行了一些简单的测试 但我不明白使用 fabs 的优点是什么 如果是 1 较慢 2 仅适用于浮子 3 如果用在不同的类型上会抛出异常 In 1 timeit abs 5 10000000 loops best
  • DateTime.MinValue 和 SqlDateTime 溢出

    我不想验证txtBirthDate所以我想通过DateTime MinValue在数据库中 我的代码 if txtBirthDate Text string Empty objinfo BirthDate DateTime MinValue
  • 堆栈粉碎后的错误信息如何处理

    我的 C 程序在 Linux 上遇到一些问题 它在 Windows 上编译并运行得很好 Linux 终端返回以下信息 stack smashing detected student terminated Backtrace lib libc
  • Gradle 7 和 jitpack.io 在发布过程中遇到错误

    当我将 Android 项目升级到 Gradle 7 0 并想要在 jitpack io 中发布 aar 库时 我遇到了 Script script maven plugin gradle line 2 What went wrong A
  • Caliburn.Micro:从 IResult 中的异常中恢复

    这是张贴在Caliburn Micro 讨论 http caliburnmicro codeplex com Thread View aspx ThreadId 244394还 我真的在寻找有关最佳解决方法的建议和意见 假设我有以下操作 p