【问题标题】:Ninject intercept not triggering with nested method calls in same classNinject 拦截未通过同一类中的嵌套方法调用触发
【发布时间】:2014-11-01 23:42:59
【问题描述】:

我是 Ninject 的新手,我试图在一个类中截取两个方法。第一种方法被拦截。第一种方法调用第二种方法,但第二种方法不触发拦截器。

有解决办法吗?

这里有一些代码:

public interface IJobMonitor
{
    void Run();

    JobCheck ManageJob(JobCheck job);
}

[LogAround]
public class JobMonitor : IJobMonitor {

  public virtual void Run(){
    //boilerplate
    var job = ManageJob(new JobCheck());
  }

  public virtual JobCheck ManageJob(JobCheck job) {
    //lots of good stuff
  }
}

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

public class LogAroundInterceptor : IInterceptor
{
    private readonly ILogger _logger;

    public LogAroundInterceptor(ILogger logger)
    {
        _logger = logger;
    }

    public void Intercept(IInvocation invocation)
    {
        var methodName = invocation.Request.Method.Name;
        try
        {

            var message = string.Format("Method {0} called", methodName);


            _logger.Info(message);
            invocation.Proceed();

            var endMessage = String.Format("Method {0} completed", methodName);
            _logger.Info(endMessage);
        }
        catch(Exception e)
        {
            var message = string.Format("Method {0} EXCEPTION occured: {1} ", methodName, e);
            _logger.Fatal(message);
            throw;
        }
    }

}

【问题讨论】:

    标签: c# inversion-of-control ninject aop


    【解决方案1】:

    这是代理实现的限制。 代理基本上是包装目标的动态类(对象)。 在运行时,目标的所有用户都在访问代理而不是目标。 IInvocation.Proceed 最终会将呼叫转发给目标。当目标调用自己的方法时,......好吧,直接调用目标方法而不通过代理和拦截器。

    你可以做的是调整你的实现,这样你就不需要拦截目标在目标上调用的方法。您可以将该方法提取到另一个类,然后您可以代理和拦截。

    【讨论】:

    • 是的,最终我想通了并提取了方法。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-10-21
    • 2012-11-04
    • 2013-10-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多