1、.NET Remoting简介
.Net Remoting提供了一种允许一个应用域中的对象与另一个应用域中的对象进行交互的框架。是.NET框架中的一个重要技术改进,它用于减轻运行应用程序的系统开销。.NET Remoting是微软随.NET推出的一种分布式应用解决方案,管理应用程序域之间的 RPC,它允许不同应用程序域之间进行通信,通信可以是在同一个进程中进行、一个系统的不同进程间进行、不同系统的进程间进行。.NET Remoting框架提供了多种服务,包括激活和生存期支持,以及负责与远程应用程序进行消息传输的通讯通道。格式化程序用于在消息通过通道传输之前,对其进行编码和解码。简单理解也就是客户端可以远程调用服务端的对象方法。
2、使用静态代理实现AOP
使用面向对象的方式实现AOP,代码如下,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
//一般每个接口或类都写在单独的.cs文件中
//本示例为了执行查看方便才写在一起
public class User class User
{
public string UserName { get; set; }
public string PassWord { get; set; }
}
public interface IUserProcessor
{
void RegUser(User user);
}
public class UserProcessor : IUserProcessor
{
public void RegUser(User user)
{
Console.WriteLine(" 用户已注册。Name:{0},PassWord:{1} ", user.UserName, user.PassWord);
}
}
//通过定义一个装饰器类实现
public class UserProcessorDecorator : IUserProcessor
{
public IUserProcessor UserProcessor { get; set; }
public UserProcessorDecorator(IUserProcessor userprocessor)
{
UserProcessor = userprocessor;
}
public void RegUser(User user)
{
PreProceed(user);
UserProcessor.RegUser(user);
PostProceed(user);
}
public void PreProceed(User user)
{
Console.WriteLine(" 方法执行前 ");
}
public void PostProceed(User user)
{
Console.WriteLine(" 方法执行后 ");
}
}
class Program
{
static void Main(string[] args)
{
User user = new User() { UserName = "cjavapy", PassWord = "123456" };
IUserProcessor userprocessor = new UserProcessorDecorator(new UserProcessor());
userprocessor.RegUser(user);
Console.ReadKey();
}
}
}
3、使用.NET Remoting/RealProxy实现AOP
使用TransparentProxy
和RealProxy
实现对象的代理,代码如下,
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Proxies;
using System.Runtime.Remoting.Messaging;
namespace ConsoleApplication
{
//一般每个接口或类都写在单独的.cs文件中
//本示例为了执行查看方便才写在一起
public class User
{
public string UserName { get; set; }
public string PassWord { get; set; }
}
public interface IUserProcessor
{
void RegUser(User user);
}
public class UserProcessor : MarshalByRefObject, IUserProcessor
{
public void RegUser(User user)
{
Console.WriteLine(" 用户已注册。Name:{0},PassWord:{1} ", user.UserName, user.PassWord);
}
}
// 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;
}
}
class Program
{
static void Main(string[] args)
{
User user = new User() { UserName = "cjavapy", PassWord = "123456" };
IUserProcessor userprocessor = TransparentProxy.Create<UserProcessor>();
userprocessor.RegUser(user);
Console.ReadKey();
}
}
}