远程代理
1、使用.Net Remoting/RealProxy
采用TransparentProxy和RealProxy实现对象的代理,实现思路如下:Client -TransparentProxy - RealProxy - Target Object
下面实现自定义的TransparentProxy和RealProxy
- using System.Runtime.Remoting.Proxies;
- using System.Runtime.Remoting.Messaging;
- //RealProxy
- public class MyRealProxy<T>:RealProxy
- {
- private T _target;
- public MyRealProxy(T target) : base(typeof(T))
- {
- this._target = target;
- }
- public override IMessage Invoke(IMessage msg)
- {
- PreProceede(msg);
- IMethodCallMessage callMessage = (IMethodCallMessage)msg;
- object returnValue = callMessage.MethodBase.Invoke(this._target, callMessage.Args);
- PostProceede(msg);
- return new ReturnMessage(returnValue, new object[0], 0, null, callMessage);
- }
- public void PreProceede(IMessage msg)
- {
- Console.WriteLine("方法执行前");
- }
- public void PostProceede(IMessage msg)
- {
- Console.WriteLine("方法执行后");
- }
- }
- //TransparentProxy
- 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;
- }
- }
用户注册接口和实现
- public interface IUserProcessor
- {
- void RegUser(User user);
- }
- public class UserProcessor : MarshalByRefObject, IUserProcessor
- {
- public void RegUser(User user)
- {
- Console.WriteLine("用户已注册。");
- }
- }
客户端调用
- public class Client
- {
- public static void Run()
- {
- try
- {
- User user = new User() { Name = "lee", PassWord = "123123123123" };
- UserProcessor userprocessor = TransparentProxy.Create<UserProcessor>();
- userprocessor.RegUser(user);
- }
- catch (Exception ex)
- {
- throw ex;
- }
- }
- }
优点:简单实现
缺点:性能差