利用.NET4.0的DynamicObject来拦截调用实现AOP

摘要:
使用AOP,我们可以很容易地实现独立于业务的横切关注点(如Log),避免了项目中这些代码的不断重复。具有NETDLR,我们可以轻松地实现一个简单的AOP。代码如下:usingSystem;使用系统。动态使用系统。反射namespaceZxf.Practices{publicclassDynamicProxy:DynamicObject{O

利用AOP我们很容易的就能实现类似Log等业务无关的横切关注点,避免了这些代码在项目中不断的重复,利用.NET DLR 我们可以很容易的就实现一个简单的AOP,代码如下:

using System;
using System.Dynamic;
using System.Reflection;

namespace Zxf.Practices
{
public class DynamicProxy : DynamicObject
{
Object m_Object;

public DynamicProxy(Object obj)
{
m_Object = obj;
}

public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
try
{
Console.WriteLine("Begin: " + binder.Name);
result = m_Object.GetType().InvokeMember(binder.Name, BindingFlags.InvokeMethod, null, m_Object, args);
Console.WriteLine("end: " + binder.Name);
return true;
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
throw;
}
}
}
}

我们可以在项目中这样使用这个AOP类:

    using System;
using Zxf.Practices;

class Program
{
static void Main(string[] args)
{
dynamic proxy = new DynamicProxy(new TestClass());
proxy.test();
}
}

public class TestClass
{
public void test()
{
throw new Exception("test");
}
}

免责声明:文章转载自《利用.NET4.0的DynamicObject来拦截调用实现AOP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Jmeter查看QPS和响应时间随着时间的变化曲线(转载)InfluxDB1.2.4部署(centos6.8)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ES6 对象的扩展

一、属性的简洁表示法 ES6 允许直接写入变量和函数,作为对象的属性和方法 let a=1; let b=2; let es5={a:a,b:b}; // 等同于 let es6={a,b}; 上面代码表明,ES6 允许在对象之中,直接写变量。这时,属性名为变量名, 属性值为变量的值 同样的,如果对象是方法,也可以简写: let es5={...

Python的魔法函数

概要 如何定义一个类 类里通常包含什么 各个部分解释 类是怎么来的 type和object的关系 判断对象的类型 上下文管理器 类结构 #!/usr/bin/env python #-*- coding: utf-8 -*- #Author: rex.cheny #E-mail: rex.cheny@outlook.com #类名后面写(object...

Java 使用 Map 实现缓存工具

以下代码参考于网上,做了小部分修改。 该代码实现了定时清除临时缓存的功能。 缓存管理类 1 package com.wbproject.util.cache; 2 3 import java.time.LocalDateTime; 4 import java.time.format.DateTimeFormatter; 5 impor...

Object.freeze

Object.freeze() 方法可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。freeze() 返回和传入的参数相同的对象。数据冻结后不再被修改在vue中数据冻结的...

springBoot AOP环绕增强、自定义注解、log4j2、MDC

(一)log4j2 maven配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId>...

error C2220: 警告被视为错误 没有生成“object”文件

http://blog.csdn.net/cay22/article/details/5613625 这种错误的原因是:原因是该文件的代码页为英文,而我们系统中的代码页为中文。 解决方案: 1. 启动Microsoft Visual Studio 2005,文件->打开->选择该cpp,然后保存。从新打开程序文件运行,此错误不再出现。     ...