.net core的实现方法:
public class DynamicProxy
{
public static void Show()
{
UserInfo userInfo = new UserInfo()
{
Account = "Admin",
Name = "李白",
Password = "888888"
};
{
IDBHelper dBHelper = new MySQLDBHelper();
dBHelper.Save(userInfo);
}
{
IDBHelper dbHelper = new MySQLDBHelper();
dbHelper = TransparentProxy.Create<IDBHelper>(dbHelper);
dbHelper.Save(userInfo);
}
}
}
public class MyRealProxy<T> : DispatchProxy
{
public T _Instance = default(T);
protected override object? Invoke(MethodInfo? targetMethod, object?[]? args)
{
BeforeProceede(targetMethod);
Console.WriteLine($"This is {targetMethod?.Name}-Invoked");
if (args != null & args.Length > 0)
Console.WriteLine($"参数信息:{JsonConvert.SerializeObject(args)}");
var result = targetMethod?.Invoke(this._Instance, args);
Console.WriteLine("方法自身被调用");
AfterProceede(targetMethod);
return result;
}
public void BeforeProceede(MethodInfo? targetMethod)
{
Console.WriteLine("方法执行前可以加入的逻辑");
}
public void AfterProceede(MethodInfo? targetMethod)
{
Console.WriteLine("方法执行后可以加入的逻辑");
}
}
public static class TransparentProxy
{
public static T Create<T>(T t)
{
dynamic tProxy = DispatchProxy.Create<T, MyRealProxy<T>>()!;
tProxy!._Instance = t;
return tProxy;
}
}
.net framework的实现方法:
public class DynamicProxy
{
public static void Show()
{
UserInfo userInfo = new UserInfo()
{
Account = "Admin",
Name = "李白",
Password = "888888"
};
{
IDBHelper dBHelper = new MysqlDBHelper();
dBHelper.Save(userInfo);
}
{
MysqlDBHelper dBHelper = TransparentProxy.Create<MysqlDBHelper>();
dBHelper.Save(userInfo);
}
}
}
public class MyRealProxy<T> : RealProxy
{
private T tTarget;
public MyRealProxy(T target)
: base(typeof(T))
{
this.tTarget = target;
}
public override IMessage Invoke(IMessage msg)
{
BeforeProceede(msg);
IMethodCallMessage callMessage = (IMethodCallMessage)msg;
foreach (var item in callMessage.Args)
{
}
var method = callMessage.MethodBase;
object returnValue = callMessage.MethodBase.Invoke(this.tTarget, callMessage.Args);
AfterProceede(msg);
return new ReturnMessage(returnValue, new object[0], 0, null, callMessage);
}
public void BeforeProceede(IMessage msg)
{
Console.WriteLine("方法执行前可以加入的逻辑");
}
public void AfterProceede(IMessage msg)
{
Console.WriteLine("方法执行后可以加入的逻辑");
}
}
public static class TransparentProxy
{
public static T Create<T>()
{
T instance = Activator.CreateInstance<T>();
MyRealProxy<T> realProxy = new MyRealProxy<T>(instance);
T transparentProxy = (T)realProxy.GetTransparentProxy();
return transparentProxy;
}
}