重复代码的设计模式/C# 技巧

2024-01-02

我有一个 WCF 服务,它记录所有异常,然后将它们作为错误异常抛出。

我做了很多重复,例如在每个服务方法中。

try { 
   // do some work

}
catch(Exception ex)
{
  Logger.log(ex);

  // actually will be Fault Exception but you get the idea.
  throw ex;
}

我正在寻找一种更优雅的方法来做到这一点,因为我在每个服务中剪切和粘贴 try/catch 。

是否有设计模式/C# 技巧可以用来使其更加优雅?


你说的是 AOP -Aspect Oriented Programming http://en.wikipedia.org/wiki/Aspect-oriented_programming

以下是我通过将“work”作为 lambda 传递来实现的方法:

public partial static class Aspect
{
  public static T HandleFaultException<T>( Func<T> fn )
  {
    try
    { 
      return fn();
    }
    catch( FaultException ex )
    {
      Logger.log(ex);
      throw;
    }
  }
}

然后使用它:

return Aspect.HandleFaultException( () =>
  {
    // call WCF
  }
);

还有其他方法可以实现相同的目标,甚至还有一些商业产品,但我发现这种方式是最明确和灵活的。

例如,您可以编写一个方面来为您创建和处置客户端:

public partial static class Aspect
{
  public static T CallClient<T>( Func<Client, T> fn )
  {
    using ( var client = ... create client ... )
    {
      return fn( client );
    }
  }
}

and so:

return Aspect.CallClient( client =>
  {
    return client.Method( ... );
  }
);

然后,您可以包装您通常想要应用的所有方面并创建一个主方面。

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

重复代码的设计模式/C# 技巧 的相关文章

随机推荐

  • 为什么我在虚拟类和具体类中收到“未定义的符号... typeinfo ... vtable”?

    我正在重新学习 C 意思是 对我温柔点 我有一个超类 Node 与抽象方法 step 必须在子类 TestNode 它编译时没有错误 也没有任何警告 但链接它会导致 bash 3 2 g Wall o bin t1 src t1 cpp U
  • 在 Java 中从文件中解组 SOAP 信封

    我想对映射器对象进行单元测试 这些对象将 wsimport 生成的 Web 服务类型映射 转换到我自己的域对象中 我还想测试错误场景 例如 SOAP 错误等 并且我认为最好在真实的 SOAP 响应上测试映射器对象 我不想向 Web 服务本身
  • div id javascript中的自动递增数字

    有人能帮帮我吗 如何使用javascript在div ID中添加自动递增数字 我有四个 div 我希望通过 javascript 在 ID 中自动对它们进行编号 box1 box2 box3 box4 这是我的代码 div class so
  • 通过 Solrj 查询 Solr:基础知识

    我正在尝试在 Eclipse 中通过 solrj 查询 solr 我已经尝试过最新的solrj 维基 http wiki apache org solr SolJava例子 import org apache solr client sol
  • docker已满,所有inode都被使用

    遇到了很大的问题 我所有的索引节点似乎都被使用了 我已经清理了所有未使用的卷 清理所有容器和图像 使用命令 gt docker prune 但它似乎仍然满了 Filesystem Inodes IUsed IFree IUse Mounte
  • 实现自定义 ViewModifier,其中输出以具体视图类型为条件 (SwiftUI)

    我想创建一个 ViewModifier 其中输出以它正在修改的内容类型为条件 我管理的概念的最佳测试 使用 Text 和 TextField 作为示例视图类型 如下 struct CustomModifier
  • Java 8 groupingby 返回多个字段

    在 Java 8 中 如何对返回多个字段的单个字段进行分组 在下面的代码中 我传递名称和要求和的字段 在这种情况下为 总计 但是我想返回客户列表中每个 名称 的 总计 和 余额 字段的总和 可以是键和值作为数组的映射 可以通过使用单个 gr
  • VBA Microsoft.XMLHTTP setRequestHeader 不发送 cookie

    我的 VBA 代码发送除 Cookie 信息之外的所有标头 Dim oXMLHttpRequest As Object Set oXMLHttpRequest CreateObject Microsoft XmlHttp oXMLHttpR
  • 解压 pyspark dataframe 中的元组列表

    我想要解压 pyspark 数据框列中的元组列表 假设一列为 blue 0 5 red 0 1 green 0 7 我想分成两列 第一列为 blue red green 第二列为 0 5 0 1 0 7 Topic Tokens 1 blu
  • Java:如何返回破坏二叉搜索树的节点?

    研究一个应该返回破坏二叉搜索树的节点的方法 如果没有一个节点返回破坏二叉搜索树的节点 则返回 null 一些测试用例通过了 但其中一些失败了 我不确定为什么 到目前为止 这是我的代码 public static Node checkBSTV
  • Windows 上“打开 CA 私钥时出错”

    我正在运行Windows Server 2003 并安装了Win64 OpenSSL v1 0 1i 轻量级 无论我遵循什么指南进行设置 在尝试实际签署证书时我总是会遇到以下错误 openssl ca in my csr out my ce
  • jq 和数学函数

    我正在从房地产数据库检索 JSON jq可以轻松提取单独的属性 值 但某些值的单位不方便 例如 LotSize 变量的单位是平方英尺 需要除以 43560 才能得到英亩 这是更常规的 而 dateSold 是 Linux 时间戳 这是一个示
  • String s1 == String s2 (true) 但 FieldOffset 不同

    当我学习java时 我了解到比较2个字符串的正确方法是使用equals而不是 这条线 static String s1 a static String s2 a System out println s1 s2 将输出 true 因为 jv
  • CSS 图像在刷新时消失

    我正在将图像应用到liCSS 元素中 图像出现在li我第一次加载时的项目 但刷新后它们消失并被项目符号点取代 我正在使用预览选项 coda 2 它使用 Safari 但在 Firefox 最新版本 和 Chrome 最新 中 图像甚至无法加
  • 如何避免使用discord.js api超过速率限制?

    我试图了解不和谐 API 的工作原理 尤其是限速政策 通过阅读docs https discord com developers docs topics rate limits invalid request limit 我需要实现一个逻辑
  • 线程“main”中的异常 java.lang.NoClassDefFoundError: junit/textui/ResultPrinter

    我正在尝试在 Android Studio 0 3 0 中编译我的 Android 项目 今天我收到以下错误 Exception in thread main java lang NoClassDefFoundError junit tex
  • 让 SBT 在 Mac OS X 上工作的问题

    我正在尝试使用 Miles Sabin 的 Shapeless 项目的 HList 所以我从Macports安装了sbt 这是版本0 11 不幸的是 当启动 sbt 时 我收到以下错误消息 java lang IncompatibleCla
  • Concepts TS 中是否有任何预定义的概念?

    Concepts lite 已被接受为 TS 并 示例实现 合并到 GCC 主分支中 因此后续问题是是否有任何概念是预先定义的 like Sortable or Random access range 我在哪里可以找到这样的预定义概念 Is
  • Blazor Dlls - 用户可以访问它们并反编译吗?

    如果我在 Blazor 中遗漏了一些明显的内容 请原谅我 但是由于 dll 像 javascript 文件一样存在于浏览器中 用户是否可以下载 dll 文件并通过反编译文件和 或运行它们来查看执行代码在浏览器之外 如果开发人员没有意识到他们
  • 重复代码的设计模式/C# 技巧

    我有一个 WCF 服务 它记录所有异常 然后将它们作为错误异常抛出 我做了很多重复 例如在每个服务方法中 try do some work catch Exception ex Logger log ex actually will be