作为AOP实现,我有两个派生自IOperationBehavior
的类,如:
public class RemedyBehaviorAttribute : Attribute, IOperationBehavior
{
.....
public RemedyBehaviorAttribute(params PrimitiveActivity[] pi)
{
PermissionsToCheck = pi;
}
...
}
和
public class AuthorityCheckAttribute : Attribute, IOperationBehavior
{
....
public AuthorityCheckAttribute(bool initiateAuthorities = false)
{
InitiateAuthorities = initiateAuthorities;
}
....
}
当我想通过WCF实现的操作应用它们时,如:
[RemedyBehavior(PrimitiveActivity.Search)]
[AuthorityCheck(true)]
public FindStudies_DTO_OUT FindStudies(FindStudies_DTO_IN findStudies_DTO_IN)
{
....
}
<{1>} BeforeCall
IParameterInspector
中的一个启动,如:
class RemedyParameterInspector : IParameterInspector
{
public bool InitiateAuthorities { get; set; }
public PrimitiveActivity[] Permissions { get; set; }
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
}
public object BeforeCall(string operationName, object[] inputs)
{
//Here one of them initiated , just the first one
// the Permissions is null if AuthorityCheckAttribute was the first
// the InitiateAuthorities is null if RemedyBehaviorAttribute was the first
}
}
只是RemedyBehavior
构造函数被调用并启动,如果我改变它们的顺序,如:
[AuthorityCheck(true)]
[RemedyBehavior(PrimitiveActivity.Search)]
public FindStudies_DTO_OUT FindStudies(FindStudies_DTO_IN findStudies_DTO_IN)
{
....
}
在BeforeCall
中仅发起了AuthorityCheck
内容,因为它被称为我在代码中的评论中提及。
那么为什么他们两个的构造函数都不会被称为WCF操作行为?
有没有办法做到这一点,或者我应该将主题组合成一个类?
真正感谢任何进一步的帮助。
更新
我为ApplyClientBehavior
实施了ApplyDispatchBehavior
和AuthorityCheckAttribute
,如:
public void ApplyClientBehavior(OperationDescription operationDescription,
ClientOperation clientOperation)
{
RemedyParameterInspector paramInspector = new RemedyParameterInspector
{
InitiateAuthorities = InitiateAuthorities
};
clientOperation.ParameterInspectors.Add(paramInspector);
}
public void ApplyDispatchBehavior(OperationDescription operationDescription,
DispatchOperation dispatchOperation)
{
RemedyParameterInspector paramInspector = new RemedyParameterInspector
{
InitiateAuthorities = InitiateAuthorities
};
dispatchOperation.ParameterInspectors.Add(paramInspector);
}
和RemedyBehaviorAttribute
之类的:
public void ApplyClientBehavior(OperationDescription operationDescription,
ClientOperation clientOperation)
{
RemedyParameterInspector paramInspector = new RemedyParameterInspector
{
Permissions = PermissionsToCheck,
InitiateAuthorities = InitiateAuthorities
};
clientOperation.ParameterInspectors.Add(paramInspector);
}
public void ApplyDispatchBehavior(OperationDescription operationDescription,
DispatchOperation dispatchOperation)
{
RemedyParameterInspector paramInspector = new RemedyParameterInspector
{
Permissions = PermissionsToCheck,
InitiateAuthorities = InitiateAuthorities
};
dispatchOperation.ParameterInspectors.Add(paramInspector);
}