Ninject拦截: Service calling intercepted method not being intercepted when called within itself

标签 ninject ninject-extensions ninject-interception

我有一个注入(inject)了 Ninject 3.0 的服务类。我已经设置了它,因此它的代理是类代理而不是接口(interface)代理。该服务有 2 个方法,第一个方法返回广泛结果,第二个方法调用第一个方法并对其进行过滤。我添加了一个拦截器来缓存第一个方法的结果。

当我从服务外部调用第一个方法时,拦截工作正常。

问题在于,当拦截器调用第二个方法时,它是通过服务本身而不是通过代理来调用它,导致我从服务中调用第一个方法没有被拦截,因此没有被缓存。

我怎样才能让它发挥作用?

更新:添加示例代码

这是我的首要任务,如果有任何内容似乎无法编译,我很抱歉

这是服务类的示例

public class Service : IService
{

    [CacheMethodOutput]
    public virtual object[] GetObjects(int x)
    {
        ...
    }

    public virtual object GetObject(int x, int y)
    {
        return GetObjects(x).SingleOrDefault(o => o.y == y);
    }
}

CacheMethodOutputAttribute 是一个简单的属性类

这是一个示例绑定(bind)(这是我确保拥有类代理而不是接口(interface)代理但实际上通过接口(interface)保留注入(inject)引用的方式)

// Binds by type instead of proxy to create a class proxy
Bind<Service>().ToSelf().InSingletonScope().Intercept().With<CacheAttributeInterceptor>()
Bind<IService>().ToMethod<Service>(r => r.Kernel.Get<Service>());

因此,当我从注入(inject) IService 的任何类调用 GetObjects 时,都会触发拦截器,但不会从 Service 本身的 GetObject 方法触发。

CacheAttributeInterceptor 看起来像这样(但实现细节无关):

public class CacheAttributeInterceptor : SimpleInterceptor
{
    public ICacheManager CacheManager {get;set;}

    public override void BeforeInvoke(IInvocation invocation)
    {
        if (Attributes.GetCustomAttribute(invocation.Request.Method, typeof(CacheMethodOutputAttribute) != null)
        {
            string key = GenerateKey(invocation.Request.Method.Name, invocation.Request.Method.Arguments);

            object returnValue;
            if (!CacheManager.TryGet(key, out returnValue))
            {
                 invocation.Proceed();
                 returnValue = invocation.ReturnValue;
                 CacheManager.Add(key, returnValue);
            }
            else
                invocation.ReturnValue = returnValue;

        }
        else
            base.BeforeInvoke(invocation);
    }
}

最佳答案

我找到了解决方案/有关问题的更多详细信息。

如果我删除 GetObject 方法上的 virtual 修饰符,它将不再被拦截,并且当它调用 GetObjects 时,incerceptor 将触发。

所有这些让我想到,如果我希望两种方法都被拦截,我需要让拦截器深入工作(如果可能的话)。

关于Ninject拦截: Service calling intercepted method not being intercepted when called within itself,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405931/

相关文章:

.net - 收藏的延迟加载 - 如何获取元素?

c# - 在类库中初始化 IoC 容器的好策略是什么?

c# - Ninject 工厂 + InCallScope + ContextPreservation

c# - Ninject 方法级拦截带参数

asp.net-mvc - 如何使用 Ninject 拦截来拦截所有 ASP.NET WebApi Controller 操作方法调用以进行日志记录?

asp.net-mvc-3 - 任务/线程的 Ninject Scope 问题

ChildKernel 上的 Ninject ActivationException

Ninject + Web API 2 : Error activating IFilterProvider using binding from IFilterProvider to DefaultFilterProvider

Ninject 拦截 - 移植到 Ninject 3.0 时的重大更改

c# - 合并 Linq 查询