


      <rss version="2.0">
         <channel>
            <title><![CDATA[Vinay Rao | Castle Project]]></title>
            <link>http://www.simplyvinay.com/</link>
            <description>My Personal Website</description>
            <copyright>Copyright 2005 by Vinay Rao</copyright>
   
      <item>
         <title><![CDATA[Logging using Interceptors in Windsor Container]]></title>
         <author><![CDATA[vinay]]></author>
         <description><![CDATA[The Windsor container gives you a provision of adding behavior to components without having to change the components implementation. For example if you want to log whenever a method is called through your services class say CustomerService, you can assign an Interceptor for this particular component and add behavior when this component is called. Lets see how logging can be achieved for the CustomerService component.<br><br>First thing is to create a LogInterceptor.<br><pre class="code"><!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;\red0\green128\blue0;\red163\green21\blue21;}??\fs20 \cf1 public\cf0  \cf1 class\cf0  \cf4 LogInterceptor\cf0  : \cf4 IInterceptor\par ??\cf0 \{\par ??    \cf1 public\cf0  \cf4 ILogger\cf0  Logger;\par ??\par ??    \cf1 public\cf0  LogInterceptor() \{ \}\par ??\par ??    \cf1 public\cf0  \cf1 void\cf0  Intercept(\cf4 IInvocation\cf0  invocation)\par ??    \{\par ??        \cf5 //Get the method name\par ??\cf0         \cf1 string\cf0  methodName = invocation.GetConcreteMethod().Name;\par ??\par ??        Log(\cf6 "Entering method: "\cf0  + methodName);\par ??        invocation.Proceed();\par ??        Log(\cf6 "Leaving mehod: "\cf0  + methodName);\par ??    \}\par ??\par ??    \cf1 private\cf0  \cf1 void\cf0  Log(\cf1 string\cf0  log)\par ??    \{\par ??        Logger.Info(log);\par ??    \}\par ??\}}
-->
<div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;<span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: rgb(43, 145, 175);">LogInterceptor</span> : <span style="color: rgb(43, 145, 175);">IInterceptor</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;{</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: rgb(43, 145, 175);">ILogger</span> Logger;</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> LogInterceptor() { }</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">void</span> Intercept(<span style="color: rgb(43, 145, 175);">IInvocation</span> invocation)</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">//Get the method name</span></p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;10</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">string</span> methodName = invocation.GetConcreteMethod().Name;</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;11</span>&nbsp;</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;12</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Log(<span style="color: rgb(163, 21, 21);">"Entering method: "</span> + methodName);</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;13</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; invocation.Proceed();</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;14</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Log(<span style="color: rgb(163, 21, 21);">"Leaving mehod: "</span> + methodName);</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;15</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;16</span>&nbsp;</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;17</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> Log(<span style="color: blue;">string</span> log)</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;18</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;19</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Logger.Info(log);</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;20</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;21</span>&nbsp;}</p></div></pre>
Here we are implementing the Intercept method of the IInterceptor interface. We are just getting the method name and logging it before the method is invoked and after its completion.<br><br>Here is the CustomerService class.<br><pre class="code"><!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red0\green0\blue0;\red43\green145\blue175;}??\fs20 \cf1 public\cf0  \cf1 class\cf0  \cf4 CustomerService\cf0  :  \cf4 ICustomerService\cf0  \par ??\{\par ??    \cf4 CustomerDAO\cf0  custDAO=\cf1 new\cf0  \cf4 CustomerDAO\cf0 ();\par ??\par ??    \cf1 public\cf0  CustomerService() \{ \}\par ??\par ??    \cf1 public\cf0  \cf1 virtual\cf0  \cf4 List\cf0 &lt;\cf4 Customer\cf0 &gt; GetCustomers()\par ??    \{\par ??        \cf1 return\cf0  custDAO.RetrieveCustomers();\par ??    \}\par ??\}}
-->
<div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;1</span>&nbsp;<span style="color: blue;">public</span> <span style="color: blue;">class</span> <span style="color: rgb(43, 145, 175);">CustomerService</span> :&nbsp; <span style="color: rgb(43, 145, 175);">ICustomerService</span> </p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;2</span>&nbsp;{</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;3</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: rgb(43, 145, 175);">CustomerDAO</span> custDAO=<span style="color: blue;">new</span> <span style="color: rgb(43, 145, 175);">CustomerDAO</span>();</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;4</span>&nbsp;</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> CustomerService() { }</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;6</span>&nbsp;</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: blue;">virtual</span> <span style="color: rgb(43, 145, 175);">List</span>&lt;<span style="color: rgb(43, 145, 175);">Customer</span>&gt; GetCustomers()</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> custDAO.RetrieveCustomers();</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;10</span>&nbsp;&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;"><span style="color: rgb(43, 145, 175);">&nbsp;&nbsp;&nbsp;11</span>&nbsp;}</p></div></pre>The GetCustomers method just calls the DAO object to get a list of customers. Next we define the components in the services.config file so that the Interceptor is injected at runtime.<br><pre class="code"><!--
{\rtf1\ansi\ansicpg\lang1024\noproof65001\uc1 \deff0{\fonttbl{\f0\fnil\fcharset0\fprq1 Courier New;}}{\colortbl;??\red0\green0\blue255;\red255\green255\blue255;\red163\green21\blue21;\red255\green0\blue0;\red0\green0\blue0;}??\fs20 \cf1 &lt;\cf3 configuration\cf1 &gt;\par ??    &lt;\cf3 components\cf1 &gt;\par ??        &lt;\cf3 component\cf1  \cf4 id\cf1 =\cf0 "\cf1 LogInterceptor\cf0 "\par ??\cf1               \cf4 type\cf1 =\cf0 "\cf1 Rails.ServicesPOC.LogInterceptor, ServicesPOC\cf0 "\par ??\cf1               \cf4 lifestyle\cf1 =\cf0 "\cf1 transient\cf0 "\cf1  /&gt;\par ??        &lt;\cf3 component\cf1  \cf4 id\cf1 =\cf0 "\cf1 service.customer\cf0 "\par ??\cf1                \cf4 type\cf1 =\cf0 "\cf1 Rails.ServicesPOC.CustomerService, ServicesPOC\cf0 "\par ??\cf1                \cf4 service\cf1 =\cf0 "\cf1 Rails.InterfacesPOC.ICustomerService, InterfacesPOC\cf0 "\cf1 &gt;\par ??            &lt;\cf3 interceptors\cf1 &gt;\par ??                &lt;\cf3 interceptor\cf1 &gt;\cf0 $\{LogInterceptor\}\cf1 &lt;/\cf3 interceptor\cf1 &gt;\par ??            &lt;/\cf3 interceptors\cf1 &gt;\par ??        &lt;/\cf3 component\cf1 &gt;\par ??    &lt;/\cf3 components\cf1 &gt;\par ??&lt;/\cf3 configuration\cf1 &gt;}
-->
<div style="background: white none repeat scroll 0% 50%; font-family: Courier New; font-size: 10pt; color: black; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;"><p style="margin: 0px;"><span style="color: blue;">&lt;</span><span style="color: rgb(163, 21, 21);">configuration</span><span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &lt;</span><span style="color: rgb(163, 21, 21);">components</span><span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: rgb(163, 21, 21);">component</span><span style="color: blue;"> </span><span style="color: red;">id</span><span style="color: blue;">=</span>"<span style="color: blue;">LogInterceptor</span>"</p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; </span><span style="color: red;">type</span><span style="color: blue;">=</span>"<span style="color: blue;">Rails.Services.LogInterceptor, Services</span>"</p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; </span><span style="color: red;">lifestyle</span><span style="color: blue;">=</span>"<span style="color: blue;">transient</span>"<span style="color: blue;"> /&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: rgb(163, 21, 21);">component</span><span style="color: blue;"> </span><span style="color: red;">id</span><span style="color: blue;">=</span>"<span style="color: blue;">service.customer</span>"</p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="color: red;">type</span><span style="color: blue;">=</span>"<span style="color: blue;">Rails.Services.CustomerService, Services</span>"</p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span><span style="color: red;">service</span><span style="color: blue;">=</span>"<span style="color: blue;">Rails.Interfaces.ICustomerService, Interfaces</span>"<span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: rgb(163, 21, 21);">interceptors</span><span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;</span><span style="color: rgb(163, 21, 21);">interceptor</span><span style="color: blue;">&gt;</span>${LogInterceptor}<span style="color: blue;">&lt;/</span><span style="color: rgb(163, 21, 21);">interceptor</span><span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: rgb(163, 21, 21);">interceptors</span><span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: rgb(163, 21, 21);">component</span><span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; &lt;/</span><span style="color: rgb(163, 21, 21);">components</span><span style="color: blue;">&gt;</span></p><p style="margin: 0px;"><span style="color: blue;">&lt;/</span><span style="color: rgb(163, 21, 21);">configuration</span><span style="color: blue;">&gt;</span></p></div></pre>Here we are adding a interceptor to the CustomerService class after defining the Interceptor.<br><br>Thats that. Now whenever the method is called for this particular component, it is automatically logged.<br><br>]]></description>
         <link><![CDATA[http://www.simplyvinay.com/Post/2/Logging-using-Interceptors-in-Windsor-Container.aspx]]></link>
         <pubDate>Thu, 19 Jun 2008 00:00:00 GMT</pubDate>
      </item>
   
         </channel>
      </rss>  
   
