I have intereception working with the Ninject Interceptions Extentions and Dynamic Proxy v3.0. I'm trying to class proxy intercept an MVC 3 contoller. The controller is intercepted but the behavior is incorrect. The intereceptor only intercepts calls to public virtual methods on the classes ControllerBase and Controller. My HomeController public virtual methods are never intercepted. Here's my code. I'm thinking of using MVC's Filters to accomplish this instead of Ninject Interception.
public class AuditAttribute : InterceptAttribute
{
public override IInterceptor CreateInterceptor(IProxyRequest request)
{
return request.Context.Kernel.Get<AuditInterceptor>();
}
}
[Audit] //HomeController method not intercepted.
public virtual ActionResult Index()
{
return View();
}
public class AuditInterceptor : SimpleInterceptor
{
public AuditInterceptor(IAuditor auditor)
{
if (auditor == null)
throw new ArgumentNullException("auditor");
this.auditor = auditor;
}
protected override void OnError(IInvocation invocation, Exception exception)
{
stopWatch.Stop();
AuditEvent auditEvent = new AuditEvent();
auditEvent.ExceptionDescription = exception.Message;
auditEvent.FormName = string.Format("class: {0}, method: {1}", invocation.Request.Method.DeclaringType, invocation.Request.Method.Name);
auditEvent.AppName = appName;
this.auditor.WriteAudit(auditEvent);
auditEvent.LengthOfMethodCall = stopWatch.Elapsed;
base.OnError(invocation, exception);
}
protected override void AfterInvoke(IInvocation invocation)
{
stopWatch.Stop();
AuditEvent auditEvent = new AuditEvent();
auditEvent.ExceptionDescription = defaultExp;
auditEvent.FormName = string.Format("class: {0}, method: {1}", invocation.Request.Method.DeclaringType, invocation.Request.Method.Name);
auditEvent.AppName = appName;
auditEvent.LengthOfMethodCall = stopWatch.Elapsed;
this.auditor.WriteAudit(auditEvent);
}
protected override void BeforeInvoke(IInvocation invocation)
{
stopWatch.Start();
}
}