5

私は次のようにNinjectWebCommonを持っています。「Timing」属性が設定されているメソッドでTimingInterceptorをトリガーすることができません。すべてのメソッド呼び出しがインターセプトされるクラスレベルでインターセターが定義されている場合は正常に機能しますが、インターセプトするメソッドを指定(オプトイン)できるようにしたいと思います。

Ninject.Extensions.Interception.DynamicProxyが追加されています。

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();
    }        
}

私のサービスクラスは次のように定義します

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";
    }
}

インターセプターと属性は次のように定義されます

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();
    }
}
4

1 に答える 1

3

ninjectがそれをインターセプトするには、仮想である必要があります。

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";
    }
}
于 2013-03-19T16:33:02.370 に答える