2. Castle Windsor
• Rammeverk for Dependency Injection
• Brukt fra starten av på Call Norwegian
• Vi benytter stort sett basisfunksjonalitet, har
vært lite avansert konfigurering
• Interceptors nyttig for å unngå repetitiv kode
16.04.2010
3. Interceptors 1
• Finnes i de fleste Dependency Injection-rammeverk
– Castle Windsor, Spring, Guice, etc.
• Enkel variant av AOP (Aspect-oriented
programming)
• Bruksområder
– Logging, auditing, transaksjonshåndtering, caching
etc.
16.04.2010
4. Interceptors 2
• Gir mulighet til å plugge inn kode som kjøres
automatisk i forbindelse med et metodekall
• Intercepter metodekall og kjører koden som har
blitt plugget inn
• Bruker reflection, tregt. Neppe noe problem i
praksis.
• Bruk på Call Norwegian:
– Logging og feilhåndtering for web service-kall
16.04.2010
5. Eksempel uten interceptor 1
public ProfileResponse FindProfileByUsername(string username)
{
var response = new ProfileResponse();
try
{
16.04.2010
(……)
}
catch (Exception ex)
{
ServiceExceptionHelper.LogAndWrapException(ex, response);
}
return response;
}
6. Eksempel uten interceptor 2
public NewPasswordResponse ResetPassword(string username)
{
var response = new NewPasswordResponse();
try
{
16.04.2010
(……)
}
catch (Exception ex)
{
ServiceExceptionHelper.LogAndWrapException(ex, response);
}
return response;
}
7. Konfigurasjon av interceptor 1
• Først: Interceptoren må være registrert
• Deretter:
• Alternativ 1: Attributt på klassen
• Uten interceptor:
public class ProfileService : IProfileService
{
• Med interceptor:
16.04.2010
(...)
}
[Interceptor(typeof(WebServiceExceptionWrapperInterceptor))]
public class ProfileService : IProfileService
{
(...)
}
8. Konfigurasjon av interceptor 2
• Alternativ 2: I Castle Windsor-registreringen
• Kan være mer fleksibelt, masseregistrering etc.
• Konfigurasjonsfil eller i kode (Fluent Registration API)
• Uten interceptor:
container.Register(Component.For<IProfileService>()
.ImplementedBy<ProfileService>());
• Med interceptor:
container.Register(Component.For<IProfileService>().
ImplementedBy<ProfileService>().
Interceptors(new InterceptorReference(
typeof(WebServiceExceptionWrapperInterceptor)))
16.04.2010
.Anywhere);
9. Implementering av interceptor
public class WebServiceExceptionWrapperInterceptor : IInterceptor
{
public void Intercept(IInvocation invocation)
{
16.04.2010
try
{
invocation.Proceed();
}
catch (Exception exception)
{
var returnValue = (ResponseBase)Activator
.CreateInstance(invocation.Method.ReturnType);
ServiceExceptionHelper
.LogAndWrapException(exception, returnValue);
invocation.ReturnValue = returnValue;
}
}
}
10. Eksempel med interceptor 1
public ProfileResponse FindProfileByUsername(string username)
{
var response = new ProfileResponse();
16.04.2010
(……)
return response;
}
11. Eksempel med interceptor 2
public NewPasswordResponse ResetPassword(string username)
{
var response = new NewPasswordResponse();
16.04.2010
(……)
return response;
}