如果你采取bbaia的方法,它可能看起来像下面的例子。 它有点简化,但你可以将它应用到你的情况。 假设我们有一个接口IDoWorkForSomeTime
有一个参数time
:
public interface IDoWorkForSomeTime
{
void Work(int time);
}
它是由TimeBoundWorker
和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容器看到[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
。详情请参阅Spring.NET documentation on AOP。