1.介绍
动态代理是个非常有用的东西,比如用动态代理加上反射可以做AOP拦截。Java中的动态代理很容易实现,有两种方式JDK代理和Cglib。但是.Net实现动态代理其实有点费劲的,大致也可以分为两种,第一种RealProxy ,有个例子(https://github.com/jinshuai/DynamicProxy.NET)。第二种采用Emit来实现,Machete.Proxy就是使用Emit来实现的。关于Emit不是本文的重点,以后做介绍。下面介绍Machete.Proxy使用。
2.一个接口和实现类
public interface IUserDao { int Delete(int id); string Get(string name); void Show(string name); int Update(string name, int id); } public class UserDao : IUserDao { public int Delete(int id) { return id; } public string Get(string name) { return "name :" + name; } public void Show(string name) { Console.WriteLine("name :" + name); } public int Update(string name, int id) { throw new Exception("update exception"); } }
3.创建拦截类
public class UserIntercept : IIntercept { /// <summary> /// 方法执行之前 /// </summary> /// <param name="method"></param> /// <param name="parameters"></param> public void BeginInvoke(string method, params object[] parameters) { Console.WriteLine("BeginInvoke method:" + method); } /// <summary> /// 方法执行之后 /// </summary> /// <param name="retVal"></param> public void EndInvoke(object retVal) { if (retVal != null) { Console.WriteLine("EndInvoke return value:" + retVal); } else { Console.WriteLine("EndInvoke no return value"); } } /// <summary> /// 执行方法出异常 /// </summary> /// <param name="exception"></param> public void OnException(Exception exception) { Console.WriteLine("OnException " + exception.Message); } }
4.生成代理类 比执行方法
IIntercept intercept = new UserIntercept(); var proxyObject = new UserDao(); var factory = new AutoProxyFatory<IUserDao>(); IUserDao userDao = factory.Build(proxyObject, intercept); string ret1 = userDao.Get("张三"); Console.WriteLine("------------------------------------------------------------"); int ret2 = userDao.Delete(1); Console.WriteLine("------------------------------------------------------------"); userDao.Show("张三"); Console.WriteLine("------------------------------------------------------------"); userDao.Update("张三", 2);
5.执行结果

执行结果
6.总结
本文介绍了Machete.Proxy简单使用,Machete.Proxy还需要不断地完善。
Machete.Proxy开源地址:https://github.com/MacheteTeam/Machete.Proxy
文章转载自乐乐学编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




