如果您采用 bbaia 的方法,它可能类似于下面的示例。它有点简化,但您可以将其应用于您的情况。假设我们有一个IDoWorkForSomeTime
带有单个参数的接口time
:
public interface IDoWorkForSomeTime
{
void Work(int time);
}
它由TimeBoundWorker
and实现AdvisedTimeBoundWorker
:
public class TimeBoundWorker : IDoWorkForSomeTime
{
public void Work(int time)
{
Console.WriteLine("Working for {0} hours", time);
}
}
public class AdvisedTimeBoundWorker : IDoWorkForSomeTime
{
/* *** Note The Attribute *** */
[ChangeParameter]
public void Work(int time)
{
Console.WriteLine("Working for {0} hours", time);
}
}
然后我们可以配置一个AOP代理在运行时改变时间参数,这样当我们运行下面的程序时:
class Program
{
static void Main(string[] args)
{
IApplicationContext ctx = new XmlApplicationContext("objects.xml");
var worker = (IDoWorkForSomeTime)ctx.GetObject("plainWorker");
var advisedWorker = (IDoWorkForSomeTime)ctx.GetObject("advisedWorker");
worker.Work(4);
advisedWorker.Work(4);
}
}
它输出:
Working for 4 hours
Working for 8 hours
因此,虽然我用值 4 调用它,但advisedWorker
使用值 8,这是我在我的 spring 配置文件中配置的。spring 容器看到该[ChangeParameter]
属性并从我的配置中知道它必须应用以下方法拦截器:
public class ChangeParamInterceptor : IMethodInterceptor
{
public int NewValue { get; set; } // set in spring cofig
public object Invoke(IMethodInvocation invocation)
{
invocation.Arguments[0] = NewValue; // change the argument
object rval = invocation.Proceed();
return rval;
}
}
它需要这个弹簧配置objects.xml
:
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net">
<object id="plainWorker"
type="Examples.Aop.Shared.TimeBoundWorker, Examples.Aop.Shared"
singleton="true">
</object>
<object id="advisedWorker"
type="Examples.Aop.Shared.AdvisedTimeBoundWorker, Examples.Aop.Shared"
singleton="true">
</object>
<!-- AOP configuration: -->
<object id="changeParamAdvice"
type="Examples.Aop.Shared.ChangeParamInterceptor, Examples.Aop.Shared">
<!-- AH! there's the 8 -->
<property name="NewValue" value="8" />
</object>
<object id="attributePointcut" type="Spring.Aop.Support.AttributeMatchMethodPointcut, Spring.Aop">
<property name="Attribute" value="Examples.Aop.Shared.ChangeParameterAttribute, Examples.Aop.Shared" />
</object>
<object id="changeParamAspect" type="Spring.Aop.Support.DefaultPointcutAdvisor, Spring.Aop">
<property name="Pointcut" ref="attributePointcut" />
<property name="Advice" ref="changeParamAdvice"/>
</object>
<object id="ProxyCreator"
type="Spring.Aop.Framework.AutoProxy.DefaultAdvisorAutoProxyCreator, Spring.Aop" />
</objects>
您有更多选项来配置 AOP 和应用建议,例如ChangeParamInterceptor
. 阅读更多关于 AOP 的 Spring.NET 文档。