AOP(Seaser.NET)ãC#ã§ãã£ã¦ã¿ã
前回ã®ç¶ãã§ãä»åº¦ã¯AOP(Aspect-Oriented Programmingãã¢ã¹ãã¯ãæåããã°ã©ãã³ã°)ã試ãã¦ã¿ãã
ã¨ãããããdll ã³ãã¼ã¨ãåç
§è¨å®ã¯ååã®ãã®ã¨åæ§ã«ãã¦ããã
AOP ã¢ã¹ãã¯ãæåããã°ã©ãã³ã°
ã©ããªãããã¨ããã¾ãã¨ã以ä¸Wikipediaãã
>>ãªãã¸ã§ã¯ãæåã§ã¯ãã¾ãåé¢ã§ããªãç¹å¾´ï¼ã¯ã©ã¹éã横æ (cross-cutting) ãããããªæ©è½ï¼ããã¢ã¹ãã¯ããã¨ã¿ãªããã¢ã¹ãã¯ãè¨è¿°è¨èªããã¡ãã¦åé¢ãã¦è¨è¿°ãããã¨ã§ããã°ã©ã ã«æè»æ§ããããããã¨ãã試ã¿ã<<
ãªãã ããã§ãã
ãã¤ãæå³ä¸æããããªãã®ããã³ã¼ãã§ç解ããã»ãããã£ã¨æ©ãã
ä»åãå
ã«ãªãã³ã¼ãã¯ä»¥ä¸ã®éãã
namespace AOPSample { class Sample { private string _prefix; public Sample(string prefix) { _prefix = prefix; } public string GetHelloMessage(string name) { string prefName = _prefix + "," + name; return "Hello " + prefName; } } class Program { static void Main(string[] args) { Sample sample = new Sample("Mr"); Console.WriteLine(sample.GetHelloMessage("Azalea")); } } }
ããã«ãã®ã³ã°æ©è½ãä»ãã¦ã¿ããã¨æãã
é常ãã¡ã½ããã®ãã°ãã¨ããªãã以ä¸ã®å½¢ã«ãªãã¨æãã
public string GetHelloMessage(string name) { Console.WriteLine("GetHelloMessage is called."); string prefName = _prefix + "," + name; Console.WriteLine("return GetHelloMessage."); return "Hello " + prefName; }
ããããããã¯ããã°ãã¨ããã¨ãããã¸ãã¯ã¨ãæååãä½æãããã¨ãããã¸ãã¯ãåé¢ã§ãã¦ãªãã¨ãè¨ããã
ã¨ãããã¨ã§ããã®åé¢ãè¡ããã®ãAOPã¨ãããã¨ã§ãå®éã«ãã£ã¦ã¿ãã
å
ãã¯ãæ¢åã®å¤æ´ç®æãè¨å®ããã
class Sample : MarshalByRefObject { /* ç¥ */ }
MarshalByRefObject ãç¶æ¿ããã ããããã¯ããã¡ã¤ã³ééä¿¡ã§ãããªãã¸ã§ã¯ãã§ãããã¨ã証æãããã®(éã«è¨ãã°ãã½ã¬ãã§ããªããã°ãã¡ã£ã¦ãã¨ããã)
Interface ãç¨æãã¦ããããçµç±ãããªããç¹ã«å¿
è¦ãªãããã(è¦ç¢ºèª)
ããã¦ãå®éã«ãã°ãåãåºãã³ã¼ããè¨è¿°ããã
public class SampleInspector : Seasar.Framework.Aop.Interceptors.AbstractInterceptor { public override object Invoke (Seasar.Framework.Aop.IMethodInvocation invocation) { string methodName = invocation.Method.DeclaringType.Name + "." + invocation.Method.Name; Console.WriteLine("éå§ " + methodName); object ret = invocation.Proceed(); Console.WriteLine("çµäº " + methodName); return ret; } }
invocation ã«ã¡ã½ããå®è¡å¯è½ç¶æ
ã§ãã¼ã¿ãå
¥ã£ã¦ããã¨ã
å¾ã¯å²ãã¨è¦ãã¾ã¾ã§ããã
ããã¦ããã®é¢é£ä»ããå¤é¨ãã¡ã¤ã«ã§è¨å®ãã¾ãã
<?xml version="1.0" encoding="utf-8" ?> <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "http://www.seasar.org/dtd/components.dtd"> <components> <component name="SampleInspector" class="AOPContainerTest.SampleInspector" /> <component class="AOPContainerTest.Sample"> <arg>"Mr"</arg> <aspect pointcut="GetHelloMessage">SampleInspector</aspect> </component> </components>
AOPContainerTest.Sample ã³ã³ãã¼ãã³ããç»é²ãã¦ããã¦ãã©ã®ã¡ã½ããã«ã©ã® Inspector ãé¢é£ä»ãããæå®ããã
å¾ã¯å¼ã³åºãå´ãåååæ§ã«æ¸ãæããã
static void Main(string[] args) { Seasar.Framework.Container.IS2Container container = Seasar.Framework.Container.Factory.S2ContainerFactory.Create("AspectSample.dicon"); Sample sample = (Sample)container.GetComponent(typeof(Sample)); Console.WriteLine(sample.GetHelloMessage("Azalea")); }
ããã§ããã°åºåã®åãé¢ããã§ããã
ãã°ã®ã¨ããããå¤æ´ããã«ããInspector ã®æå®ãå¤ããã ãã ãã£ã
ããããåçæ§ã¯ä¾¿å©ã ãã