【IT168 技术】为了让项目的代码看起来更干净,需要一个AOP!
于是就实现了一个非常简单的,非常轻量级,有多轻量级呢?
实现的AOP叫做Earthworm(蚯蚓,为什么叫这个?因为它小,它会疏通!,项目的本意也是这样,所以就叫这个!),命名空间Earthworm下有8个代码文件,包括4个公开接口,1个公开特性,1个公开的抽象类,2个内部类。所以对外部调用者而言,可见的只有6个,够轻量级了吧!
先看项目的组成!
一:先从简单的说吧!4个公开的接口:IStopAdvice
///<summary>
/// 拦截通知接口
///</summary>
public interface IStopAdvice
{ ///<summary>
/// 是否可以继续方法的执行
///</summary>
///<param name="msg">要执行方法的调用消息</param>
///<returns>如果可以继续执行,返回true,否则为false</returns>
bool CanContinueMethod(IMethodCallMessage msg); }
////////////////////////////////////////////////////////////////////////// /**示例
/// <summary>
/// 检查对象权限,可以在用户进行关键操作的方法前
/// 比如btn_DeleteUser_Click方法
/// </summary>
class CheckPermission : IStopAdvice
{
/// <summary>
/// 检查当前用户的权限
/// 如果是管理员则可以继续执行方法
/// 否则不能执行
/// </summary>
/// <param name="msg">要执行方法的调用消息</param>
/// <returns>是管理员返回true,否则为false</returns>
public bool CanContinueMethod(IMethodCallMessage msg)
{ if (User.CurrentUser.IsAdministrator)
return true;
else
return false; }
} * */ //////////////////////////////////////////////////////////////////////////
二: IBeforeAdvice
///<summary>
/// 前通知接口
///</summary>
public interface IBeforeAdvice {
///<summary>
/// 在方法执行前,需要进行的通知
///</summary>
///<param name="callMsg">要执行方法的调用消息</param>
void DoAdvice(IMethodCallMessage callMsg);
}
////////////////////////////////////////////////////////////////////////// /**示例 /// <summary>
/// 用户登录时间记录对象
/// </summary>
class LoginTimeLogger:IBeforeAdvice {
/// <summary>
/// 记录当前用户登录到系统的时间
/// </summary>
/// <param name="callMsg">要执行方法的调用消息</param>
public void DoAdvice(IMethodCallMessage callMsg)
{ if (callMsg==null)
{
return;
}
Log.Write(string.Format
("用户:{0}于{1}登陆到此系统",
/// 前通知接口
///</summary>
public interface IBeforeAdvice {
///<summary>
/// 在方法执行前,需要进行的通知
///</summary>
///<param name="callMsg">要执行方法的调用消息</param>
void DoAdvice(IMethodCallMessage callMsg);
}
////////////////////////////////////////////////////////////////////////// /**示例 /// <summary>
/// 用户登录时间记录对象
/// </summary>
class LoginTimeLogger:IBeforeAdvice {
/// <summary>
/// 记录当前用户登录到系统的时间
/// </summary>
/// <param name="callMsg">要执行方法的调用消息</param>
public void DoAdvice(IMethodCallMessage callMsg)
{ if (callMsg==null)
{
return;
}
Log.Write(string.Format
("用户:{0}于{1}登陆到此系统",
User.CurrentUser.Name, DateTime.Now.ToString()));
}
}
**/
}
}
**/
三:IAfterAdvice
///<summary>
/// 后通知接口
///</summary>
public interface IAfterAdvice { ///<summary>
/// 在方法执行后,需要进行的通知
///</summary>
///<param name="callMsg">执行完方法的返回消息</param>
void DoAdvice(IMethodReturnMessage callMsg);
}
////////////////////////////////////////////////////////////////////////// /**示例
/// 后通知接口
///</summary>
public interface IAfterAdvice { ///<summary>
/// 在方法执行后,需要进行的通知
///</summary>
///<param name="callMsg">执行完方法的返回消息</param>
void DoAdvice(IMethodReturnMessage callMsg);
}
////////////////////////////////////////////////////////////////////////// /**示例
/// <summary>
/// 用户登出时间记录
/// </summary>
class LogoutTimeLogger:IAfterAdvice
{ /// <summary>
/// 记录当前用户登出系统的时间
/// </summary>
/// <param name="callMsg">执行完方法的返回消息</param>
public void DoAdvice(IMethodReturnMessage callMsg)
{ if (callMsg == null) {
{ /// <summary>
/// 记录当前用户登出系统的时间
/// </summary>
/// <param name="callMsg">执行完方法的返回消息</param>
public void DoAdvice(IMethodReturnMessage callMsg)
{ if (callMsg == null) {
return;
}
Log.Write(string.Format("用户:{0}于{1}登出此系统", User.CurrentUser.Name, DateTime.Now.ToString()));
}
} **/
}
Log.Write(string.Format("用户:{0}于{1}登出此系统", User.CurrentUser.Name, DateTime.Now.ToString()));
}
} **/
注释比较齐全就不说了,这三个接口是提供给“通知对象”的!