Question

I have a NinjectWebCommon as follow. I am unable to get the TimingInterceptor to trigger on the method that has "Timing" attribute set. It works fine if the intercetor is defined at the class level where all method call is going to be intercepted, but I would like to have the ability to specify the method I want to intercept (opt in).

I do have the Ninject.Extensions.Interception.DynamicProxy added.

public static class NinjectWebCommon 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var NinjectSettings = new NinjectSettings();
        var kernel = new StandardKernel(NinjectSettings);

        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        GlobalConfiguration.Configuration.DependencyResolver = new BazingaNinjectResolver(kernel);

        RegisterServices(kernel);
        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<IMyService>().To<MyService>().InRequestScope();
    }        
}

my Service class define as follow

public class MyService : IMyService
{
    Logger log;

    public MyService()
    {
        log = LogManager.GetLogger(this.GetType().FullName);
    }

    [Timing]
    public string GetString()
    {
        log.Info("log me!!");
        return "Cool string !!!!";
    }

    public string GetUnInterceptString()
    {
        return "Not intercepted";
    }
}

Interceptor and attribute define as follows

public class TimingAttribute : InterceptAttribute
{
    public override IInterceptor CreateInterceptor(IProxyRequest request)
    {
        return request.Context.Kernel.Get<TimingInterceptor>();
    }
}

public class TimingInterceptor : SimpleInterceptor
{
    readonly Stopwatch _stopwatch = new Stopwatch();

    protected override void BeforeInvoke(IInvocation invocation)
    {
        _stopwatch.Start();
    }

    protected override void AfterInvoke(IInvocation invocation)
    {
        _stopwatch.Stop();
        string message = string.Format("Execution of {0} took {1}.",
            invocation.Request.Method,
            _stopwatch.Elapsed);

        _stopwatch.Reset();
    }
}
Was it helpful?

Solution

You need it to be virtual, for ninject to intercept it:

public class MyService : IMyService
{
    Logger log;

    public MyService()
    {
        log = LogManager.GetLogger(this.GetType().FullName);
    }

    [Timing]
    public virtual string GetString()
    {
        log.Info("log me!!");
        return "Cool string !!!!";
    }

    public string GetUnInterceptString()
    {
        return "Not intercepted";
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top