Don’t you hate when writing code you have to think about generic exception handling, logging of method calls, caching of methods, authorization, etc... Well suppose there was a tool/technique you could use that you could write the above items once and make sure they get implemented on existing code along with any new code added in the future. Castle Windsor and its Interceptors support just that.
In the example below we will create a interceptor and do the necessary wiring up to make it work. We will be using an ASP.NET MVC4 application based on the initial Windsor setup done in my last blog post.
Create a manager class to do some work. We will call methods of this class in our controller class. later in this blog post In the Infrastructure folder create a new folder called Managers. Inside the Managers folder create a new folder called Interfaces. Create an interface called IExampleManager in the interface folder.
Creating the concrete implementation of the manager, create a class called ExampleManager in the Managers folder.
Now we need to register our new manager in Windsor. In the Infrastructure\Installers folder add a new class called ManagerInstaller.
Now that Windsor knows how to handle the manager we can modify our controllers constructor like so
Since Windsor knows how to turn an IExampleManager into ExampleManager it will handle this for us when Windsor instantiates the controller.
Modify the controller action method to call a method on the example manager.
Now lets say we wanted to intercept the call to any public method of the ExampleManager class. We can do this by adding in an interceptor. To do this we will need to create the interceptor. Create a new folder inside the infrastructure folder called Interceptors. Create a new class in this folder called ExampleInterceptor.
Now we need to tell Windsor about the interceptor. In the Infrastructure\Installers folder lets add a new class called InterceptorInstaller.
Now lets go back to our manager installer and add in the interceptor to all managers.
As you can see the interceptor intercepted the call to the method on our ExampleManager. Adding new public methods to our manager call will automatically get intercepted also. This means that adding code in the future required no thought about the interceptor. This opens up all kinds of ideas for interceptors like:
- Exception Handling
- Performance Counters
Note there is a different way to implement interceptors. You can use an attribute on a class that is already under the control of Windsor. More information about this can be found here: http://docs.castleproject.org/Windsor.Interceptors.ashx.