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
网友评论