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

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
    {
        /// 
        /// 方法执行之前
        /// 
        /// 
        /// 
        public void BeginInvoke(string method, params object[] parameters)
        {
            Console.WriteLine("BeginInvoke method:" + method);
        }

        /// 
        /// 方法执行之后
        /// 
        /// 
        public void EndInvoke(object retVal)
        {
            if (retVal != null)
            {
                Console.WriteLine("EndInvoke  return value:" + retVal);
            }
            else
            {
                Console.WriteLine("EndInvoke  no return value");
            }
        }

        /// 
        /// 执行方法出异常
        /// 
        /// 
        public void OnException(Exception exception)
        {
            Console.WriteLine("OnException " + exception.Message);
        }
    }

4.生成代理类 比执行方法

       IIntercept intercept = new UserIntercept();
            var proxyObject = new UserDao();
            var factory = new AutoProxyFatory();
            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)