利用Lambda表达式、扩展方法以及泛型来实现一个另类的AOP
2011-01-07 17:05
711 查看
假设我们有如下的代码
这个代码中有两段重复(异常处理块重复以及在异常时记Log的逻辑重复),这个重复从AOP的角度来看的话应该是属于横切关注点,所以如果能以AOP的方式解决那应该是最好的方案了,以下实现了一种特殊形式的AOP,代码如下:
现在的代码已经简捷多了,这主要是因为利用到了如下的扩展方法:
public class SecurityServiceProxy { public string Encrypt(string input) { try { return new SecurityServiceClient().Encrypt(input); } catch(Exception ex) { //Log Exception throw; } } public string Decrypt(string input) { try { return new SecurityServiceClient().Decrypt(input); } catch(Exception ex) { //Log Exception throw; } } }
这个代码中有两段重复(异常处理块重复以及在异常时记Log的逻辑重复),这个重复从AOP的角度来看的话应该是属于横切关注点,所以如果能以AOP的方式解决那应该是最好的方案了,以下实现了一种特殊形式的AOP,代码如下:
public class SecurityServiceProxy { public string Encrypt(string input) { return new SecurityServiceClient().ExecAndLogExcetion(client => client .Encrypt(input)); } public string Decrypt(string input) { return new SecurityServiceClient().ExecAndLogExcetion(client => client .Decrypt(input)); } }
现在的代码已经简捷多了,这主要是因为利用到了如下的扩展方法:
public static class ObjectExtensions { public static void LockExec<T>(this T obj, Action<T> action) where T : class { lock (obj) { action(obj); } } public static void ExecAndLogExcetion<T>(this T obj, Action<T> action) { try { action(obj); } catch (Exception) { //log excetion throw; } } public static void ExecAndLogExcetion<T1, T2>(this T1 obj, T2 obj1, Action<T1, T2> action) { try { action(obj, obj1); } catch (Exception) { //log excetion throw; } } public static TResult ExecAndLogExcetion<T, TResult>(this T obj, Func<T, TResult> func) { try { return func(obj); } catch (Exception) { //log excetion throw; } } public static TResult ExecAndLogExcetion<T1, T2, TResult>(this T1 obj, T2 obj1, Func<T1, T2, TResult> func) { try { return func(obj, obj1); } catch (Exception) { //log excetion throw; } } }
相关文章推荐
- 利用Lambda表达式、扩展方法以及泛型来为对象添加方法
- 实现一个对象验证库系列 -- 3) Fluent以及扩展方法实现 (请大神批评)
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
- 通过另类的泛型约束将两个输入输出参数不同的方法合并成一个方法的实现
- 每天学习一点.net(5) 利用匿名方法Lambda表达式(=>)实现委托
- 每天学习一点.net(5) 利用匿名方法Lambda表达式(=>)实现委托
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
- 扩展 delphi 泛型 以实现类似lambda功能 , C#中的any count first last 等扩展方法
- Spring AOP及MethodInterceptor拦截器实现方法拦截以及切入点函数阻止执行
- AOP实现拦截对象以及获取切入目标方法和注解
- 给定一个布尔表达式,由0、1、&、|和^等符号组成,以及一个想要的布尔结果result,实现一个函数,算出有几种括号的放法可使该表达式
- Java 8 函数式接口、lambda表达式、方法以及构造器引用
- C#中利用泛型扩展方法辅助枚举类型进行Flags处理
- 笔记:JS利用正则表达式实现trim方法
- 匿名函数、委托、lambda表达式、扩展方法
- javascript下利用数组缓存正则表达式的实现方法
- c#创建静态类,在其中定义一个泛型方法,实现查找数组元素的功能
- 利用C#实现AOP常见的几种方法详解
- 用JavaScript的正则表达式验证网址格式是否正确,方法很多,这只是一个实现的方法.
- 利用正则表达式实现统计代码中的注释行、空行、以及代码行的数量。