AOP Ninject停止拦截方法被调用

Jos*_*shy 2 c# aop ninject interception ninject-interception

我正在使用Ninject和AOP来做一些缓存.我有一个属性,我可以应用于我的存储库中的任何方法和BeforeInvoke它将返回我的缓存对象,如果有一个和AfterInvoke创建一个缓存的对象.这一切都很好,但我无法弄清楚如何停止调用初始方法,即如果有一个缓存的对象返回而不是调用intyercepted方法.我的拦截器在这里:

public class CacheInterceptor : SimpleInterceptor
{
    protected override void BeforeInvoke(IInvocation invocation)
    {
        Type returnType = invocation.Request.Method.ReturnType;
        string cacheKey = CacheKeyBuilder.GetCacheKey(invocation, serializer);
        object cachedValue = cache.Get(cacheKey);
        if (cachedValue == null)
        {
            invocation.Proceed();
        }
        else
        {
            object returnValue = serializer.Deserialize(returnType, cachedValue);
            invocation.ReturnValue = returnValue;
            returnedCachedResult = true;
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

即使在else语句中我显然没有说要调用被调用的方法'invocation.Proceed();' 它仍然会调用它.如何告诉ninject只返回invocation.ReturnValue?

Rem*_*oor 5

SimpleInterceptor在这种情况下,您不能使用它,因为它是最常见场景的基类,您希望在实际方法调用之前或之后执行操作.此外,您不能调用Proceed而是实现IInterceptor接口并将代码放入Intercept方法中.

但是我们可能应该SimpleInterceptor在将来的版本中扩展,以便您可以防止调用实际方法:

public abstract class SimpleInterceptor : IInterceptor
{
    private bool proceedInvocation = true;

    /// <summary>
    /// Intercepts the specified invocation.
    /// </summary>
    /// <param name="invocation">The invocation to intercept.</param>
    public void Intercept( IInvocation invocation )
    {
        BeforeInvoke( invocation );
        if (proceedInvocation)
        {
            invocation.Proceed();
            AfterInvoke( invocation );
        }
    }

    /// <summary>
    /// When called in BeforeInvoke then the invokation in not proceeded anymore.
    /// Or in other words the decorated method and AfterInvoke won't be called anymore.
    /// Make sure you have assigned the return value in case it is not void.
    /// </summary>
    protected void DontProceedInvokation()
    {
        this.proceedInvocation = false;
    }

    /// <summary>
    /// Takes some action before the invocation proceeds.
    /// </summary>
    /// <param name="invocation">The invocation that is being intercepted.</param>
    protected virtual void BeforeInvoke( IInvocation invocation )
    {
    }

    /// <summary>
    /// Takes some action after the invocation proceeds.
    /// </summary>
    /// <param name="invocation">The invocation that is being intercepted.</param>
    protected virtual void AfterInvoke( IInvocation invocation )
    {
    }
}
Run Code Online (Sandbox Code Playgroud)