我有一个NinjectWebCommon如下。我无法让TimingInterceptor在设置了“Timing”属性的方法上触发。如果拦截器是在将要拦截所有方法调用的类级别定义的,则效果很好,但是我希望能够指定我要拦截(选择加入)的方法。

我确实添加了 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();
    }
}

最佳答案

您需要将其虚拟化,以使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";
    }
}

关于c# - 如何使用InterceptAttribute使用Ninject拦截,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15505051/

10-13 09:01