-
Notifications
You must be signed in to change notification settings - Fork 45
ImplementingAdvices
jacobbarnes-ac edited this page May 19, 2022
·
8 revisions
In our implementation:
- The advices are attribute implementations
- The pointcuts are attributes applied to method, property, type or assembly
Here is a first method advice:
public class ADummyMethodAdvice : Attribute, IMethodAdvice
{
// your only duty is to implement the method below...
public void Advise(MethodAdviceContext context)
{
// ... and optionnally call the original method (this is usually a good idea)
context.Proceed();
}
}
Some special method advices are property advices:
public class ADummyPropertyAdvice : Attribute, IPropertyAdvice
{
public void Advise(PropertyAdviceContext context)
{
if(context.IsGetter)
{
context.Proceed();
// you can check the return value here, by using context.ReturnValue
}
else
{
// you can check the setter value here, by using context.Value
context.Proceed()
}
}
}
There is also a specialization for parameter advices (please note that parameter advices can be applied at method level, in which case they apply to all method parameters):
public class ADummyParameterAdvice : Attribute, IParameterAdvice
{
public void Advise(ParameterAdviceContext context)
{
if (context.IsIn)
{
// input or ref parameters can be checked here
}
context.Proceed();
if (context.IsOut)
{
// output or ref parameters and return value can be checked here
}
}
}
A method info advice
public class ADummyMethodInfoAdvice : Attribute, IMethodInfoAdvice
{
public void Advise(MethodInfoAdviceContext context)
{
// do what you want here
}
}
And a property info advice:
public class ADummyPropertyInfoAdvice : Attribute, IPropertyInfoAdvice
{
public void Advise(PropertyInfoAdviceContext context)
{
// do what you want here
}
}
public class MethodWeavingAdvice : Attribute, IMethodWeavingAdvice
{
public void Advise(MethodWeavingContext context)
{
// we add a property, named after the target method.
context.AddPublicAutoProperty(context.TargetMethodName + "_Friend", typeof(string));
// and we also renamed the target method. All calls are preserved.
context.TargetMethodName += "_Renamed";
// also, extra initializers can be added to target class
// those initializeds will be invoked at the end of constructors
context.AddInitializer(Initializer);
}
public static void Initializer(object instance)
{
// you can add extra initialization from here
}
}
There are a few special attributes that can be applied to advices:
-
[AbstractTarget]
: the methods where this advice is applied have their original code removed, socontext.ProceedAdvice()
can not be called (it will throw an exception) -
[Priority]
: allows to give advice a priority, so Mr.Advice ensures at runtime that advices are invoked by descending priority. Default priority (when this attribute is not used) is0
.
Please note that a single class can implement multiple advice interfaces (info advice and method advice, for example).
You can now learn how to use those advices.
Mr. Advice is sponsored by Arx One and available as a NuGet package