AOP面向切面编程
实现示例
公共代码
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Password { get; set; }
}
public interface IUserProcessor
{
void RegUser(User user);
User GetUser(User user);
}
public class UserProcessor : IUserProcessor
{
public User GetUser(User user)
{
throw new NotImplementedException();
}
public void RegUser(User user)
{
Console.WriteLine("正在用户注册,用户名称{0} Password{1}", user.Name, user.Password);
}
}
静态AOP实现
装饰模式静态代理
class DecroratorUser : IUserProcessor
{
readonly IUserProcessor m_old;
public DecroratorUser(IUserProcessor old)
{
m_old = old;
}
public User GetUser(User user)
{
throw new NotImplementedException();
}
public void RegUser(User user)
{
Console.WriteLine("开始装饰");
m_old.RegUser(user);
Console.WriteLine("结束装饰");
}
}
代理模式静态代理
class ProxyUser : IUserProcessor
{
readonly UserProcessor m_realUserProcessor = new UserProcessor();
public User GetUser(User user)
{
throw new NotImplementedException();
}
public void RegUser(User user)
{
Console.WriteLine("开始代理");
m_realUserProcessor.RegUser(user);
Console.WriteLine("结束代理");
}
}
动态代理AOP实现
Remoting方式
User user = new User()
{
Name = "Eleven",
Password = "123456"
};
UserProcessor userProcessor = TransparentProxy.Create<UserProcessor>();
userProcessor.RegUser(user);
/// <summary>
/// 真实代理
/// </summary>
/// <typeparam name="T"></typeparam>
public class LocalRealProxy<T> : RealProxy
{
readonly T tTarget;
public LocalRealProxy(T target)
: base(typeof(T))
{
this.tTarget = target;
}
public override IMessage Invoke(IMessage msg)
{
BeforeProceede(msg);//Log try-catch
IMethodCallMessage callMessage = (IMethodCallMessage)msg;
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("结束代理");
}
}
/// <summary>
/// 透明代理
/// </summary>
public static class TransparentProxy
{
public static T Create<T>()
{
T instance = Activator.CreateInstance<T>();
LocalRealProxy<T> realProxy = new LocalRealProxy<T>(instance);
T transparentProxy = (T)realProxy.GetTransparentProxy();
return transparentProxy;
}
}
Unity中的AOP
引入unity 配置文件,
可以进行多重拦截,
可以实现 权限、日志、异常、性能分析、缓存、验证 多重拦截
动态化配置即可实现功能, 原有代码 0 侵入
由于代码较多,故 作为资源上传
下载Unity AOP