美文网首页
开源.Net动态代理框架:Machete.Proxy

开源.Net动态代理框架:Machete.Proxy

作者: 有点胖的小乐乐 | 来源:发表于2017-10-15 23:59 被阅读12次

    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

    相关文章

      网友评论

          本文标题:开源.Net动态代理框架:Machete.Proxy

          本文链接:https://www.haomeiwen.com/subject/ggocuxtx.html