bbaiaのアプローチをとると、以下のようになります。 これは少し簡略化されていますが、状況に合わせて適用することができます。 のは、我々は、単一のパラメータtime
とのインターフェースIDoWorkForSomeTime
を持っていると仮定しましょう:
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を、使用しています。春のコンテナが[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をご覧ください。