在系统实现中AOP常用于并发、权限管理、事务处理、日志记录、错误处理方面。本文介绍如何使用EnterpriseServerBase类库中的AOP框架来实现权限管理。
一个用户是否有权限调用某个操作(方法),是由我们的应用决定了,不同的应用有不同的实现,但是,如果需要使用EnterpriseServerBase类库中的AOP的权限管理,则应用必须实现下面的接口IPermissionVerifier:
/**/
///<summary>
///IPermissionVerifier用于验证当前用户对目标类的目标方法的调用权限是否足够。
///如果需要使用Aop来进行权限管理,则只要实现IPermissionVerifier接口。
///朱伟2005.08.228
///</summary>
public
interface
IPermissionVerifier

{
boolQualifiedToOperation(objectpermissionNeeded,stringdestClassFullName,stringdestMethodName);
}
当用户调用没有资格的操作时,将抛出PermissionLimittedException异常,其定义如下:
/**/
///<summary>
///当没有权限的用户调用某项操作时,将抛出此异常
///</summary>
[Serializable]
public
class
PermissionLimittedException:Exception

{
publicPermissionLimittedException()


{
}

publicPermissionLimittedException(stringmsg):base(msg)


{
}

publicPermissionLimittedException(stringmsg,ExceptioninnerException):base(msg,innerException)


{
}
}
接下来看真正实现权限AOP的PermissionProxy类:
/**/
///<summary>
///PermissionProxy权限代理,如果当前用户不够权限调用某个方法,则抛出异常。
///朱伟2005.08.22
///</summary>
public
class
PermissionProxy:AopProxyBase

{
publicPermissionProxy(MarshalByRefObjectobj,Typetype,objectaopArg):base(obj,type,aopArg)


{}

publicoverridevoidPreProcess(IMethodCallMessagerequestMsg)


{
TypeverifierType=(Type)this.AopClassArgument;
TypedestType=typeof(IPermissionVerifier);
if(!destType.IsAssignableFrom(verifierType))


{
thrownewException("thePermissionVerifierTypeisinvalid!");
}

IPermissionVerifierpmVerifier=(IPermissionVerifier)Activator.CreateInstance(verifierType);
if(pmVerifier==null)


{
thrownewException("thePermissionVerifierTypeisinvalid!");
}

objectpmNeeded=this.GetAopMethodArgument((IMethodCallMessage)requestMsg);
stringclassName=AopHelper.GetFullClassName(requestMsg);
stringmethodName=AopHelper.GetMethodName(requestMsg);

boolqualified=pmVerifier.QualifiedToOperation(pmNeeded,className,methodName);

if(!qualified)


{
thrownewPermissionLimittedException(string.Format("Currentuserhavenopermissiontocalldestmethod:{0}.{1}!",className,methodName));
}

}

publicoverridevoidPostProcess(IMethodCallMessagerequestMsg,IMethodReturnMessageRespond)


{

}
}
可以看出PermissionProxy是在预处理中进行权限鉴定的。关于其基类AopProxyBase的更多信息,可以参见前面的文章C# AOP微型框架实现(一) 和 C# AOP微型框架实现(二) 。(注意,现在的AOP框架版本与参文中的介绍稍有出入!)
另外,为了契合EnterpriseServerBase类库中的AOP框架,需要下面的工厂:
/**/
///<summary>
///PermissionProxyFactory权限代理工厂。
///朱伟2005.08.228
///</summary>
public
class
PermissionProxyFactory:IAopProxyFactory

{

IAopProxyFactory成员#regionIAopProxyFactory成员

publicAopProxyBaseCreateAopProxyInstance(MarshalByRefObjectobj,Typetype,objectaopArg)


{
returnnewPermissionProxy(obj,type,aopArg);
}

#endregion
}
那么如何使用权限AOP了?
(1)根据目标系统对权限的管理需求实现IPermissionVerifier接口。
(2)在需要进行权限管理的类上加上特性[AopProxyAttribute(typeof(PermissionProxyFactory) ,typeof(PermissionVerifier))],
其中PermissionVerifier是IPermissionVerifier实现。
(3)在需要进行权限管理的方法上加上特性[MethodAopSwitcherAttribute(true ,pmNeeded)],其中pmNeeded为调用此方法所需的资格,
其类型由目标系统决定。
最后给出一个具体的例子说明:
[AopProxyAttribute(
typeof
(PermissionProxyFactory),Class1.verifier)]
public
class
Example:ContextBoundObject

{
[MethodAopSwitcherAttribute(true,Permission.Super)]
publicvoidSayHello(stringname)


{
Console.WriteLine("Hello,"+name);
}

[MethodAopSwitcherAttribute(true,Permission.Common)]
publicvoidSayByebye(stringname)


{
Console.WriteLine("Byebye,"+name);
}
}



public
class
PermissionVerifier:IPermissionVerifier

{

IPermissionVerifier成员#regionIPermissionVerifier成员

publicboolQualifiedToOperation(objectpermissionNeeded,stringdestClassFullName,stringdestMethodName)


{
Permissionpm=(Permission)permissionNeeded;

if(pm==Permission.Common)


{
returntrue;
}

returnfalse;
}

#endregion

}

public
enum
Permission

{
Common,Super
}

[STAThread]
static
void
Main(
string
[]args)

{
try


{
Exampleexa=newExample();
exa.SayByebye("sky");
exa.SayHello("sky");
}
catch(Exceptionee)


{
Console.WriteLine(ee.Message);
Console.Read();
}
}
如果需要例子的完整源码,可以email向我索取!也欢迎和我讨论关于AOP应用的更多技术。后面将会给出使用AOP进行日志记录的技术实现。